使用 Lodash 查找对象数组的新添加元素

问题描述

假设我们有两个数组。

var a = [B,C,E];
var b = [A,B,D,E];

数组 a 是我们在本地保存的认数组。 现在,我们从中获取的 api 向我们发送了这个名为 b 的数组 a 的新版本。 我如何使用 lodash 这样我才能得到这两个数组的差异,所以我得到了这种情况 [A,D] 返回?

更新: 我想出了我自己的解决方案,它有点奏效,所以只有在接受的答案由于某种原因不起作用时才尝试这个:

  const getobjectDiff = (newArr,oldArr) => {
    if (_.isEqual(newArr,oldArr)) {
      return true;
    } else {
      const checkLength = newArr.length;
      const checkerLength = oldArr.length;
      var indexes = [];
      var falseIndexes = [];
      var allIndexes = [];
      for (let i = 0; i <= checkerLength; i++) {
        for (let j = 0; j <= checkLength - 1; j++) {
          allIndexes.push(i);
          if (_.isEqual(newArr[i],oldArr[j])) {
            indexes.push(i);
          } else {
            falseIndexes.push(i);
          }
        }
      }
      const falseUniqueIndexes = _.uniq(falseIndexes);
      return _.difference(falseUniqueIndexes,indexes);
    }
  };
```

解决方法

我们可以使用 _.differenceWith_.isEqual 来检查对象之间的深度相等性。

_.isEqual 将在两个对象之间进行深度比较以查看它们是否等效,因此我们可以使用它来比较从 JSON 解码的对象。

这是一个简单的例子,但是,只要它们相等(由 lodash 确定),这将适用于更复杂的对象

const apiResponseA = '[{"id":"B"},{"id":"C"},{"id":"E"}]';
const apiResponseB = '[{"id":"A"},{"id":"B"},{"id":"D"},{"id":"E"}]'

const a = JSON.parse(apiResponseA);
const b = JSON.parse(apiResponseB);

console.log("a:",apiResponseA)
console.log("b:",apiResponseB)

console.log("Difference:",JSON.stringify(_.differenceWith(b,a,_.isEqual)));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>

,

我知道您专门要求使用 lodash 解决方案,但我只想提一下,您可以在没有 3rd 方库的情况下非常简单地完成此操作 - 只需使用 Array.prototype.filter 和 Array.prototype.includes,如下所示:

var a = ['B','C','E'];
var b = ['A','B','D','E'];

function getDifference(a,b) {
  return b.filter(letter => !a.includes(letter));
}

console.log(getDifference(a,b));