我认为“嵌套值”不是正确的术语,但这就是我想要做的:
假设我有一个如下所示的对象:
{
title: 'Foo',
content: {
top: 'Bar',
bottom: 'Baz'
}
}
我想检查 title 或 content.top 或 content.bottom 是否包含某个字符串。
我发现我可以使用如下方式循环遍历对象键:
for (var property in object) {
if (object.hasOwnProperty(property)) {
// do stuff
}
}
但是如果键本身就是一个对象并且包含其他键怎么办?如果这些键也是具有不同键的对象怎么办?那么基本上,是否有一种方法以“深度”方式搜索整个对象,以便无论值“嵌套”多深,它都会搜索所有值?
最佳答案
嵌套对象形成一种称为树的递归数据结构,并且可以使用递归函数轻松浏览树。递归函数是调用自身的函数,例如以下browse
函数:
var tree = {
a: "azerty",
child: {
q: "qwerty"
}
};
browse(tree);
function browse (tree) {
for (var k in tree) {
if (isTree(tree[k])) {
browse(tree[k]);
} else {
console.log(k, tree[k]);
}
}
}
function isTree (x) {
return Object.prototype.toString.call(x) === "[object Object]";
}
但是,此函数旨在反复执行相同的任务。更通用的方法是将应用于每个叶子的操作外包:
var tree = {
a: 'azerty',
child: {
q: 'qwerty'
}
};
browse(tree, log);
browse(tree, searchQ);
function browse (tree, operation) {
for (var k in tree) {
if (isTree(tree[k])) {
browse(tree[k], operation);
} else {
operation(k, tree[k]);
}
}
}
function log (label, leaf) {
console.log("logged", label, leaf);
}
function searchQ (label, leaf) {
if (leaf.indexOf('q') !== -1) {
console.log("found", label, leaf);
}
}
function isTree (x) {
return Object.prototype.toString.call(x) === "[object Object]";
}
关于javascript - 如何循环访问对象键值和嵌套值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47462169/