[英]Get the difference of two array of objects with multiple constraints
我試圖通過應用多個AND約束來獲取兩個對象數組的差異。
在這里找到一個小例子:
const dbArr = [{ name: 'Company1', symbol: 'C1', ratingID: '1', stockID: '2' }, { name: 'Company2', symbol: 'C2', ratingID: '1', stockID: '2' }, { name: 'Company3', symbol: 'C3', ratingID: '1', stockID: '2' }, { name: 'Company4', symbol: 'C4', ratingID: '1', stockID: '2' }, ] const diffArr = [{ name: 'Company1', symbol: 'C1', ratingID: '1', stockID: '2' }, { name: 'Company6', symbol: 'C6', ratingID: '1', stockID: '2' }, { name: 'Company1', symbol: 'C1', ratingID: '5', stockID: '3' }, { name: 'Company10', symbol: 'C10', ratingID: '1', stockID: '2' }, ] const res = diffArr.filter(cv => !dbArr.find(e => e.name === cv.name)).filter(cv => !dbArr.find(e => e.ratingID === cv.ratingID)).filter(cv => !dbArr.find(e => e.stockID === cv.stockID)) console.log(res) /* RESULT I would like to get: const dbArr = [{ name: 'Company1', symbol: 'C1', ratingID: '1', stockID: '2' }, { name: 'Company2', symbol: 'C2', ratingID: '1', stockID: '2' }, { name: 'Company3', symbol: 'C3', ratingID: '1', stockID: '2' }, { name: 'Company4', symbol: 'C4', ratingID: '1', stockID: '2' }, { name: 'Company6', symbol: 'C6', ratingID: '1', stockID: '2' }, { name: 'Company1', symbol: 'C1', ratingID: '5', stockID: '3' }, { name: 'Company10', symbol: 'C10', ratingID: '1', stockID: '2' }, ] */
作為最終結果,我嘗試連接多個finds
,但是得到一個空數組。
但是,如果僅使用一次find
,則我的方法有效。
有什么建議我做錯了嗎?
當您鏈接多個.filter
,您實際上是在說只返回滿足所有條件的元素。 而您期望的數組包含滿足任何 diff條件的元素。
const dbArr = [{ name: 'Company1', symbol: 'C1', ratingID: '1', stockID: '2' }, { name: 'Company2', symbol: 'C2', ratingID: '1', stockID: '2' }, { name: 'Company3', symbol: 'C3', ratingID: '1', stockID: '2' }, { name: 'Company4', symbol: 'C4', ratingID: '1', stockID: '2' }, ] const diffArr = [{ name: 'Company1', symbol: 'C1', ratingID: '1', stockID: '2' }, { name: 'Company6', symbol: 'C6', ratingID: '1', stockID: '2' }, { name: 'Company1', symbol: 'C1', ratingID: '5', stockID: '3' }, { name: 'Company10', symbol: 'C10', ratingID: '1', stockID: '2' }, ] const res = diffArr.filter(cv => !dbArr.find(e => e.name === cv.name && e.ratingID === cv.ratingID && e.stockID === cv.stockID)); console.log(res)
其次,您期望數組不僅包含其他元素( diffArr
元素,但不dbArr
),還包含移除的元素( dbArr
元素,但不diffArr
)。 要包含這些元素,您還必須迭代dbArr
。
const dbArr = [{ name: 'Company1', symbol: 'C1', ratingID: '1', stockID: '2' }, { name: 'Company2', symbol: 'C2', ratingID: '1', stockID: '2' }, { name: 'Company3', symbol: 'C3', ratingID: '1', stockID: '2' }, { name: 'Company4', symbol: 'C4', ratingID: '1', stockID: '2' }, ]; const diffArr = [{ name: 'Company1', symbol: 'C1', ratingID: '1', stockID: '2' }, { name: 'Company6', symbol: 'C6', ratingID: '1', stockID: '2' }, { name: 'Company1', symbol: 'C1', ratingID: '5', stockID: '3' }, { name: 'Company10', symbol: 'C10', ratingID: '1', stockID: '2' }, ]; let same = (cv1, cv2) => cv1.name === cv2.name && cv1.ratingID === cv2.ratingID && cv1.stockID === cv2.stockID; let res1 = diffArr.filter(cv1 => !dbArr.find(cv2 => same(cv1, cv2))); let res2 = dbArr.filter(cv1 => !diffArr.find(cv2 => same(cv1, cv2))); let res = [...res1, ...res2]; console.log(res);
另外要注意, find
應替換some
其清晰的意圖更加一致。 array.some(predicate)
說:“數組的任何元素是否通過謂詞?”; 而find
表示“哪個是通過謂詞的第一個元素?” ( mdn )
也許只需遍歷兩個數組,然后在結果中未找到該元素時將其添加到結果中。
const dbArr = [{
name: 'Company1',
symbol: 'C1',
ratingID: '1',
stockID: '2'
},
{
name: 'Company2',
symbol: 'C2',
ratingID: '1',
stockID: '2'
},
{
name: 'Company3',
symbol: 'C3',
ratingID: '1',
stockID: '2'
},
{
name: 'Company4',
symbol: 'C4',
ratingID: '1',
stockID: '2'
},
]
const diffArr = [{
name: 'Company1',
symbol: 'C1',
ratingID: '1',
stockID: '2'
},
{
name: 'Company6',
symbol: 'C6',
ratingID: '1',
stockID: '2'
},
{
name: 'Company1',
symbol: 'C1',
ratingID: '5',
stockID: '3'
},
{
name: 'Company10',
symbol: 'C10',
ratingID: '1',
stockID: '2'
},
]
const res = [];
dbArr.map(cv => {if(res.find(e => e.name === cv.name))return cv; res.push(cv)});
diffArr.map(cv => {if(res.find(e => e.name === cv.name))return cv; res.push(cv)});
我將.reduce
與JSON.parse
,其思想是它將檢查字符串數組並將不存在的值壓入累加器中
const dbArr = [{ name: 'Company1', symbol: 'C1', ratingID: '1', stockID: '2' }, { name: 'Company2', symbol: 'C2', ratingID: '1', stockID: '2' }, { name: 'Company3', symbol: 'C3', ratingID: '1', stockID: '2' }, { name: 'Company4', symbol: 'C4', ratingID: '1', stockID: '2' }, ] const diffArr = [{ name: 'Company1', symbol: 'C1', ratingID: '1', stockID: '2' }, { name: 'Company6', symbol: 'C6', ratingID: '1', stockID: '2' }, { name: 'Company1', symbol: 'C1', ratingID: '5', stockID: '3' }, { name: 'Company10', symbol: 'C10', ratingID: '1', stockID: '2' }, ]; const res = diffArr.reduce((acc, item, index, self) => { if (typeof acc !== 'object') { acc = []; } acc.push(JSON.stringify(item)); // push the item as a string dbArr.forEach(i => { let j = JSON.stringify(i); // make dbArr items strings if (acc.indexOf(j) === -1) { // check if the item exists in the accumulator acc.push(j); // add it } }) if (index === self.length - 1) { // when we reach the last index, we'll convert the strings back to Objects acc = acc.map(i => JSON.parse(i)); } return acc; }, []); console.log(res)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.