Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找包含值的嵌套对象_Javascript_Loops_Filter - Fatal编程技术网

Javascript 查找包含值的嵌套对象

Javascript 查找包含值的嵌套对象,javascript,loops,filter,Javascript,Loops,Filter,我有一个包含多个其他对象的对象,在这些嵌套对象中是一个包含多个对象的数组,每个对象都有一个uid。我试图在对象上循环并找到包含特定uid的对象 我的数据是这样的 const data = { "3c5671fde44f44f9ad59d59eb810d87e": { "heading": "Heading 1", "items": [ { "content": { "uid": "4fcd5f4af7a448d48463d4e0

我有一个包含多个其他对象的对象,在这些嵌套对象中是一个包含多个对象的数组,每个对象都有一个uid。我试图在对象上循环并找到包含特定uid的对象

我的数据是这样的

const data = {
  "3c5671fde44f44f9ad59d59eb810d87e": {
    "heading": "Heading 1",
    "items": [
      {
        "content": {
          "uid": "4fcd5f4af7a448d48463d4e0a11297d9"
        }
      },
      {
        "content": {
          "uid": "31f975440a0a431592e127b2891cd142"
        }
      }
    ]
  },
  "ea80e8315b554c9bb40958a6cacf4b0c": {
    "heading": "Heading 2",
    "items": [
      {
        "content": {
          "uid": "d6de8db4c2a74da6915a44d3964277d6"
        }
      }
    ]
  }
}
我要搜索的uid是d6de8db4c2a74da6915a44d3964277d6。找到时,我要返回它的父对象,以便访问heading属性

当前的代码看起来像这样,但它不工作,这是一个漫长的一天,所以我可能错过了一些非常简单的东西

const currentUid = "d6de8db4c2a74da6915a44d3964277d6";

const currentHeading = Object.keys(data).forEach(section => {
  return data[section].items.filter(item => {
    return item.content.uid === currentUid;
  });
});
当调试成功时,当它找到正确的uid时,它的计算结果为true,它只是不返回任何内容

欢迎任何帮助

考虑改用Object.values方法来提取所提供uid的父标题

采用这种方法,您可以迭代数据的值,并过滤那些包含与uid匹配的项的节值。在下面的回答中,这是通过:

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

函数findHeadingdata,uid{ return Object.valuesdata.filtersection=>{ //在此节中找到任何具有匹配uid的项,并相应地筛选此节 return section.items.someitem=>item.content.uid===currentUid } .mapsection=>{ //匹配项uid的任何节的映射标题 返回节.标题 }; } 常数数据={ 3c5671fde44f44f9ad59d59eb810d87e:{标题:标题1,项目:[{标题:4fcd5f4af7a448d48463d4e0a11297d9},{内容:{标题:31f975440a0a431592e127b2891cd142},ea80e8315b554c9bb40958a6cacf4b0c:{标题:标题2,项目:[内容:标题:D6DE8DB4C2A74DA6915D34277D6}}} } const currentUid=d6de8db4c2a74da6915a44d3964277d6; console.logfindHeadingdata,currentUid考虑改用Object.values方法来提取所提供uid的父标题

采用这种方法,您可以迭代数据的值,并过滤那些包含与uid匹配的项的节值。在下面的回答中,这是通过:

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

函数findHeadingdata,uid{ return Object.valuesdata.filtersection=>{ //在此节中找到任何具有匹配uid的项,并相应地筛选此节 return section.items.someitem=>item.content.uid===currentUid } .mapsection=>{ //匹配项uid的任何节的映射标题 返回节.标题 }; } 常数数据={ 3c5671fde44f44f9ad59d59eb810d87e:{标题:标题1,项目:[{标题:4fcd5f4af7a448d48463d4e0a11297d9},{内容:{标题:31f975440a0a431592e127b2891cd142},ea80e8315b554c9bb40958a6cacf4b0c:{标题:标题2,项目:[内容:标题:D6DE8DB4C2A74DA6915D34277D6}}} } const currentUid=d6de8db4c2a74da6915a44d3964277d6; console.logfindHeadingdata,currentUidforEach仅用于循环数组,使用find从object.keysdata中查找对象的键。在回调内部,使用一些而不是过滤器来检查存在性。此解决方案将导致对象的键或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属性

注意:由于find和some的回调中只有一条语句,因此可以使用隐式返回箭头函数来缩短代码:

const currentHeadingKey = Object.keys(data).find(section =>
    data[section].items.some(item => item.content.uid === currentUid)
);
forEach仅用于循环数组,请使用find从object.keysdata中查找对象的键。在回调内部,使用一些而不是过滤器来检查存在性。此解决方案将导致对象的键或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属性

注意:由于find和some的回调中只有一条语句,因此可以使用隐式返回箭头函数来缩短代码:

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

将forEach替换为find,将filter替换为some,那么currentHeading将是数据对象的键。您可以通过数据[currentHeading]访问该对象,就这么简单!如果你把它作为一个答案,我会接受它,谢谢!将forEach替换为find,将filter替换为some,那么currentHeading将是数据对象的键。您可以通过数据[currentHeading]访问该对象,就这么简单!如果你把它作为一个答案,我会接受它,谢谢!为什么要在只需要布尔值的情况下使用过滤器构建数组?@MarkMeyer感谢您-除了从OP继承它之外,没有其他原因。将更新为someWhy在您只需要
ant是一个布尔值,你可以使用它吗?@MarkMeyer谢谢你-除了从OP继承它之外没有其他原因。它将更新为一些布尔值