javascript迭代对象嵌套数组中的对象,并按ID过滤,返回更新后的原始数据集

javascript迭代对象嵌套数组中的对象,并按ID过滤,返回更新后的原始数据集,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有一个嵌套对象数组,我希望将项中的对象保持为id等于我作为参考的过滤器列表中的一个 const数据=[{ “otherStuff”:“otherB”, “项目”:{ “项目1”:[{ “id”:“id1”, “信息”:“信息1” }, { “id”:“id2”, “信息”:“信息22” } ], “项目20”:[{ “id”:“id3”, “信息”:“信息5” }], “项目5”:[{ “id”:“id4”, “信息”:“信息6” }, { “id”:“id5”, “信息”:“信息7” }

我有一个嵌套对象数组,我希望将
中的对象保持为
id
等于我作为参考的过滤器列表中的一个

const数据=[{
“otherStuff”:“otherB”,
“项目”:{
“项目1”:[{
“id”:“id1”,
“信息”:“信息1”
},
{
“id”:“id2”,
“信息”:“信息22”
}
],
“项目20”:[{
“id”:“id3”,
“信息”:“信息5”
}],
“项目5”:[{
“id”:“id4”,
“信息”:“信息6”
},
{
“id”:“id5”,
“信息”:“信息7”
}
]
}
}, {
“otherStuff”:“otherA”,
“项目”:{
“项目1”:[{
“id”:“id1”,
“信息”:“信息10000”
},
{
“id”:“id2”,
“信息”:“信息220000”
}
],
“项目20”:[{
“id”:“id3”,
“信息”:“信息5000”
}],
“项目5”:[{
“id”:“id4”,
“信息”:“信息60000”
},
{
“id”:“id5”,
“信息”:“信息7000”
}
]
}
}];
const keep=['id4','id2'];
keep.forEach(函数(val){
data.forEach(函数(条目、索引){
const entrySelected=[];
Object.key(entry.items).forEach(item=>{
var match=entry.items[item].find(obj=>obj.id==val);
如果(匹配){
entrySelected.push(匹配)
}
});
数据[索引].items=entrySelected;
});
})

log(数据)
您可以迭代对象的值,然后减少新数组需要的项。稍后将其分配到
项目

var data=[{otherStuff:“otherB”,items:{item1:[{id:“id1”,info:“info1”},{id:“id2”,info:“info22”},item20:[{id:“id3”,info:“info5”},item5:[{id:“id4”,info:“info6”},{id:“id5”,info:“info7”},{otherA],items:{item1 id:[{id:“id1:“id1”,info:“info10000”},info220000”],第20项:[{id:“id3”,info:“info5000”}],第5项:[{id:“id4”,info:“info60000”},{id:“id5”,info:“info7000”}],
keep=['id4','id2'];
data.forEach(o=>
o、 项目=对象
.钥匙(o.项目)
.减少((r,k)=>o
.项目[k]
.reduce((s,p)=>s.concat(保持包括(p.id)?p:[],r),[]);
控制台日志(数据)

作为控制台包装{max height:100%!important;top:0;}
您能建议一个不使用Object.values的解决方案吗?
类型错误:o.items[k]。reduce不是一个函数
我在应用程序内部运行时遇到此错误。但是当我把它作为一个单独的脚本运行时,它就工作了。有什么想法吗?也许你的数据中没有用于
o.items[k]
的数组。我在脚本中使用了与硬编码相同的数据,它可以工作,但当它来自DB时,它就不工作了。它们是相同的数据,只是复制粘贴。可能您还有一个附加属性,它不在硬编码对象中。请尝试第二种方法,其中包含非数组项的筛选器。