javascript - 如何循环访问对象键值和嵌套值

标签 javascript

我认为“嵌套值”不是正确的术语,但这就是我想要做的:

假设我有一个如下所示的对象:

{
    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/

相关文章:

javascript - 使用 angular.js 根据复选框单击将一个文本字段值分配给另一个文本字段值

javascript - php从查询字符串中删除单个变量值对

javascript - 模型更改时 ng-options 不更新

javascript - jQuery getJSON 中的回调执行顺序

javascript - 从 .json 获取内容并写入变量

javascript - 动态指令元素在从服务中预填充数据时失败

javascript - 替换隐藏/显示上的链接文本

javascript - 根据匹配键合并两个多维数组?

javascript - 仅使用javascript读取TXT文件

javascript - onclick 删除影响其他按钮