[英]Filter array of objects based on content of another array of nested objects
我想過濾positions
數組並刪除people
數組中表示的任何位置。
我嘗試了_.forEach
和_.filter
的幾種組合,但似乎無法弄清楚。
console.log(position)
var test = _.filter(position, function(pos) {
_.forEach(people, function(peo) {
_.forEach(peo.position, function(peoplePos) {
if(peoplePos.value == pos.value){
return false;
}
});
});
});
console.log(test)
我認為我的主要問題是位置嵌套在每個人的對象中
var positions = [{
val: 'CEO',
label: 'CEO XXX'
}, {
val: 'CTO',
label: 'CTO XXX'
}, {
val: 'CBO',
label: 'CBO XXX'
}, {
val: 'CLO',
label: 'CLO XXX'
}]
var people = [{
id: 'AAA',
positions: [{
val: 'CEO',
label: 'CEO XXX'
}]
},{
id: 'BBB',
positions: [{
val: 'CXO',
label: 'CXO XXX'
},{
val: 'CEO',
label: 'CEO XXX'
}]
},{
id: 'CCC',
positions: [{
val: 'CTO',
label: 'CTO XXX'
}]
}]
在這種情況下,我的目標是以下結果:
var positions = [{
val: 'CBO',
label: 'CBO XXX'
}, {
val: 'CLO',
label: 'CLO XXX'
}]
由於 CBO 和 CLO 不由 people 數組中的任何對象表示。
一種快速的方法是將 people 數組字符串化並檢查字符串中的位置。
這為您省去了遍歷嵌套結構的麻煩。
var positions = [{ val: 'CEO', label: 'CEO XXX' }, { val: 'CTO', label: 'CTO XXX' }, { val: 'CBO', label: 'CBO XXX' }, { val: 'CLO', label: 'CLO XXX' }] var people = [{ id: 'AAA', positions: [{ val: 'CEO', label: 'CEO XXX' }] }, { id: 'BBB', positions: [{ val: 'CXO', label: 'CXO XXX' }, { val: 'CEO', label: 'CEO XXX' }] }, { id: 'CCC', positions: [{ val: 'CTO', label: 'CTO XXX' }] }]; var stringifiedPeople = JSON.stringify(people) var newPositions = positions.filter((position) => !stringifiedPeople.includes(JSON.stringify(position)) ); console.log(newPositions)
或者您可以創建一個包含所有占用位置的地圖並過濾掉可用位置。
var positions = [{ val: 'CEO', label: 'CEO XXX' }, { val: 'CTO', label: 'CTO XXX' }, { val: 'CBO', label: 'CBO XXX' }, { val: 'CLO', label: 'CLO XXX' }] var people = [{ id: 'AAA', positions: [{ val: 'CEO', label: 'CEO XXX' }] }, { id: 'BBB', positions: [{ val: 'CXO', label: 'CXO XXX' }, { val: 'CEO', label: 'CEO XXX' }] }, { id: 'CCC', positions: [{ val: 'CTO', label: 'CTO XXX' }] }]; var mappedPositions = {} people.forEach((p) => p.positions.forEach((position) => mappedPositions[position.val] = true ) ); var newPositions = positions.filter((position) => !mappedPositions[position.val]); console.log(newPositions)
您可以使用filter
、 find
和some
來過濾掉那些沒有出現在 people 數組的位置數組中的對象。
var positions = [{val:'CEO',label:'CEOXXX'},{val:'CTO',label:'CTOXXX'},{val:'CBO',label:'CBOXXX'},{val:'CLO',label:'CLOXXX'}]; var people = [{id:'AAA',positions:[{val:'CEO',label:'CEOXXX'}]},{id:'BBB',positions:[{val:'CXO',label:'CXOXXX'},{val:'CEO',label:'CEOXXX'}]},{id:'CCC',positions:[{val:'CTO',label:'CTOXXX'}]}]; const out = positions.filter(position => { return !people.find(person => { return person.positions.some(({ val, label }) => { return val === position.val && label === position.label; }); }); }); console.log(out);
執行我的評論。
整個事情可以寫成一個大的.reduce()
放在位置數組上以提高效率,但我更喜歡顯示確切的步驟,以便更清楚地了解每個步驟的作用。
var positions = [{val:'CEO',label:'CEOXXX'},{val:'CTO',label:'CTOXXX'},{val:'CBO',label:'CBOXXX'},{val:'CLO',label:'CLOXXX'}]; var people = [{id:'AAA',positions:[{val:'CEO',label:'CEOXXX'}]},{id:'BBB',positions:[{val:'CXO',label:'CXOXXX'},{val:'CEO',label:'CEOXXX'}]},{id:'CCC',positions:[{val:'CTO',label:'CTOXXX'}]}]; const occupied_positions = people .map( person => person.positions ) .flat() .map( position => position.val ); const all_positions = positions .map( position => position.val ); const open_positions = all_positions .filter( position => !occupied_positions.includes( position )) .map( position => positions.find( source => source.val === position )); console.log( open_positions );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.