簡體   English   中英

獲取具有多個約束的兩個對象數組的差

[英]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)});

我將.reduceJSON.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM