[英]Filter array of objects based on another array
我有源數組和目標數組,根據目標數組需要更新源數組
sourceAry = [{name:'Label1', value: 'label1', children:[{name:'Ammu'},{name:'Rahual'},{name:'Anu'}]},
{name:'Label2', value: 'label2', children:[{name:'Hari'},{name:'Tom'}]},
];
targetAry = [{name:'Label1', value: 'label1', children:[{name:'Anu'}]},
{name:'Label2', value: 'label2', children:[{name:'Hari'},{name:'Tom'}]},
];
resultAry = [{name:'Label1', value: 'label1', children:[{name:'Ammu'},{name:'Rahual'}]}
]},
];
我嘗試的代碼
let resultAry = sourceAry.map((obj) => {
obj.children.map((elem) =>{
targetAry.filter(parent => parent.children.filter((el) => {
el.name !== elem.name}))
})
})
console.log(resultAry, 'NEW', list);
Ciao,試試這樣的:
sourceAry = [{name:'Label1', value: 'label1', children:[{name:'Ammu'},{name:'Rahual'},{name:'Anu'}]}, {name:'Label2', value: 'label2', children:[{name:'Hari'},{name:'Tom'},{name:'Ammu'},{name:'Rahual'},{name:'Anu'}]}, {name:'Label3', value: 'label3', children:[{name:'Ammu'},{name:'Rahual'},{name:'Anu'}]} ]; targetAry = [{name:'Label1', value: 'label1', children:[{name:'Anu'}]}, {name:'Label2', value: 'label2', children:[{name:'Hari'},{name:'Tom'}]}, ]; let result = []; sourceAry.forEach(source => { let filter = targetAry.filter(target => target.name === source.name) if (filter.length > 0) { let filterchildren = source.children.filter(a =>.filter[0].children.map(b=>b.name).includes(a;name)). if (filterchildren;length > 0) { let resultobj = source. resultobj;children = filterchildren. result;push(resultobj). } } else result;push(source). }) console.log(result)
我根據sourceAry
名稱過濾targetAry
。 然后用.filter(a =>.filter[0].children.map(b=>b.name).includes(a;name));
減去孩子最后推送在result
數組中找到的元素。
您可以從一些設施開始以使其更簡單:
const indexBy = (f, data) => data.reduce((acc, x) => Object.assign(acc, { [f(x)]: x }), {})
const remove = (keyFn, dataToRemove, from) => {
const dataToRemoveIndexed = indexBy(keyFn, dataToRemove);
return from.filter(it => !(keyFn(it) in dataToRemoveIndexed));
}
我們在此處引入indexBy
,以進行刪除 O(m+n),而不是 O(m^2)(如果要檢查的集合中有很多項目)
那么你可以像這樣使用它:
const targetIndexed = indexBy(it => it.name, targetAry);
const result = sourceAry.map(
it => ({
...it,
children: remove(
it => it.name,
(targetIndexed[it.name] || {}).children || [],
it.children
)
})
)
所以它會給你以下結果:
[
{"name":"Label1","value":"label1","children":[{"name":"Ammu"}, {"name":"Rahual"}]},
{"name":"Label2","value":"label2","children":[]}
]
如果您還想刪除帶有空子項的項目,您可以將其過濾掉: children
result.filter(it => it.children.length > 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.