Javascript 如何按对象值筛选数组并返回新数组?

Javascript 如何按对象值筛选数组并返回新数组?,javascript,arrays,object,filtering,Javascript,Arrays,Object,Filtering,我很难找到一种方法,通过id值过滤这个数组,并生成一个新的数组,用它的过滤器保持坐标 阵列示例: var herbs =[ { "coords":[3300,2796],"items":[ {id: "dandelion",qty: 72}, {id: "sage",qty: 4}, {id: "valerian",qty: 1}, ]}, { "coords":[3300,2800],"items":[ {id: "dandelion",qty: 26}, {id: "valerian",qt

我很难找到一种方法,通过id值过滤这个数组,并生成一个新的数组,用它的过滤器保持坐标

阵列示例:

var herbs =[
{
"coords":[3300,2796],"items":[
{id: "dandelion",qty: 72},
{id: "sage",qty: 4},
{id: "valerian",qty: 1},
]},
{
"coords":[3300,2800],"items":[
{id: "dandelion",qty: 26},
{id: "valerian",qty: 7},
{id: "sage",qty: 2},
]},
{
"coords":[3300,2804],"items":[
{id: "dandelion",qty: 57},
{id: "sage",qty: 4},
{id: "wormwood",qty: 1},
]}]
我想按id过滤它,用它的坐标生成一个新的

例如:

id=dandelion进行过滤

var dandelion =[
{
"coords":[3300,2796],"items":[
{id: "dandelion",qty: 72},
]},
{
"coords":[3300,2800],"items":[
{id: "dandelion",qty: 26},
]},
{
"coords":[3300,2804],"items":[
{id: "dandelion",qty: 57},
]}]
id=sage筛选

var sage =[
{
"coords":[3300,2796],"items":[
{id: "sage",qty: 4},
]},
{
"coords":[3300,2800],"items":[
{id: "sage",qty: 2},
]},
{
"coords":[3300,2804],"items":[
{id: "sage",qty: 4},
]}]

另外,这个阵列相当大,我有467000个坐标。因此,我计划对其进行筛选,并在每次筛选后保存一个新文件。

您可以使用
reduce
将reduce调用中的
筛选结果推送到一个包含
项的新数组。仅当在
项中的某个位置找到搜索词时,它才会推送到新数组:

var=[
{
“协调”:[33002796],“项目”:[
{id:“蒲公英”,数量:72},
{id:“sage”,数量:4},
{id:“缬草”,数量:1},
]},
{
“协调”:[33002800],“项目”:[
{id:“蒲公英”,数量:26},
{id:“缬草”,数量:7},
{id:“sage”,数量:2},
]},
{
“协调”:[33002804],“项目”:[
{id:“蒲公英”,数量:57},
{id:“sage”,数量:4},
{id:“艾草”,数量:1},
]}]
函数filterByID(数组,id){
返回数组.reduce((a,c)=>{
让items=c.items.filter(i=>i.id==id)
if(项目长度){
a、 推({
coords:c.coords,
项目:项目
})
}
归还
}, [])
}    
console.log(filterByID(草药,“蒲公英”))

log(filterByID(香草,sage))
这非常简单。使用标准的
Array
方法
map
filter
获取所需内容

var=[{
“coords”:[33002796],
“项目”:[{
id:“蒲公英”,
数量:72
},
{
id:“圣人”,
数量:4
},
{
id:“缬草”,
数量:1
},
]
},
{
“坐标”:[33002800],
“项目”:[{
id:“蒲公英”,
数量:26
},
{
id:“缬草”,
数量:7
},
{
id:“圣人”,
数量:2
},
]
},
{
“coords”:[33002802],
“项目”:[{
id:“蒲公英”,
数量:26
},
{
id:“缬草”,
数量:7
},
//没有圣人
]
},
{
“coords”:[33002804],
“项目”:[{
id:“蒲公英”,
数量:57
},
{
id:“圣人”,
数量:4
},
{
id:“艾草”,
数量:1
},
]
}
];
函数过滤器ERBS(id){
返回草药。地图((h)=>{
返回{
coords:h.coords,
items:h.items.filter((i)=>i.id==id)
}
})//空项数组情况下的筛选结果
.filter((h)=>h.items.length);
}
var dand=filterHerbs(“蒲公英”)
控制台日志(DAD);
var sage=过滤器ERBS(“sage”);

控制台日志(sage)谢谢,成功了!不知道减少的方法!非常感谢@Mark\M
const dandelion = herbs.map(
    ({coords, items}) => items.filter(
        ({id}) => id === 'dandelion'
).map(ob => ({coords, ...ob})));