问题描述
假设我们有两个数组。
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));