查找包含值的嵌套对象

时间:2018-12-09 21:44:59

标签: javascript loops filter

我有一个包含多个其他对象的对象,在这些嵌套对象内部是一个包含多个对象的数组,每个对象都带有一个uid。我试图遍历对象,并找到包含特定uid的对象。

我的数据如下

const data = {
  "3c5671fde44f44f9ad59d59eb810d87e": {
    "heading": "Heading 1",
    "items": [
      {
        "content": {
          "uid": "4fcd5f4af7a448d48463d4e0a11297d9"
        }
      },
      {
        "content": {
          "uid": "31f975440a0a431592e127b2891cd142"
        }
      }
    ]
  },
  "ea80e8315b554c9bb40958a6cacf4b0c": {
    "heading": "Heading 2",
    "items": [
      {
        "content": {
          "uid": "d6de8db4c2a74da6915a44d3964277d6"
        }
      }
    ]
  }
}

发现要返回的uidd6de8db4c2a74da6915a44d3964277d6时,我想返回它的父对象,以便可以访问heading属性。

当前代码看起来像这样,但是它不起作用,已经过了很长的一天,所以我可能会错过一些非常简单的东西。

const currentUid = "d6de8db4c2a74da6915a44d3964277d6";

const currentHeading = Object.keys(data).forEach(section => {
  return data[section].items.filter(item => {
    return item.content.uid === currentUid;
  });
});

在调试时,如果找到正确的true,则成功评估为uid,只是不返回任何内容。

欢迎您的帮助!

2 个答案:

答案 0 :(得分:2)

forEach仅用于循环数组,请使用findObject.keys(data)中查找对象的键。在回调中使用some而不是filter来检查是否存在。该解决方案将导致对象的键或null的键。要获取对象,只需检查是否已返回键,然后使用该键即可获取对象:

const currentHeadingKey = Object.keys(data).find(section => {
  return data[section].items.some(item => {
    return item.content.uid === currentUid;
  });
});

const currentHeading = currentHeadingKey != null ? data[currentHeadingKey] : null;

currentHeading现在是整个对象(如果找到),否则是null。您可以访问该对象的heading属性。

注意:由于findsome的回调中都只有一个语句,因此可以使用箭头函数的隐式返回来缩短代码: / p>

const currentHeadingKey = Object.keys(data).find(section =>
    data[section].items.some(item => item.content.uid === currentUid)
);

答案 1 :(得分:1)

请考虑改用Object.values()方法,为提供的uid提取“父标题”。

采用这种方法,您可以迭代data的值,并过滤包含匹配section的{​​{1}}的{​​{1}}值。在下面的答案中,这是通过以下方式完成的:

items

最后,您可以uid过滤后的部分来获取具有匹配return items.some(item => item.content.uid === currentUid) 项的部分的相应标题:

map()