Javascript 查找包含值的嵌套对象
我有一个包含多个其他对象的对象,在这些嵌套对象中是一个包含多个对象的数组,每个对象都有一个uid。我试图在对象上循环并找到包含特定uid的对象 我的数据是这样的Javascript 查找包含值的嵌套对象,javascript,loops,filter,Javascript,Loops,Filter,我有一个包含多个其他对象的对象,在这些嵌套对象中是一个包含多个对象的数组,每个对象都有一个uid。我试图在对象上循环并找到包含特定uid的对象 我的数据是这样的 const data = { "3c5671fde44f44f9ad59d59eb810d87e": { "heading": "Heading 1", "items": [ { "content": { "uid": "4fcd5f4af7a448d48463d4e0
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继承它之外没有其他原因。它将更新为一些布尔值