比较数组对象并显示差异

时间:2018-09-27 11:23:13

标签: javascript ecmascript-6 ecmascript-5

我有两个数组要比较,并检查其中一个数组中是否有已删除的项目。如果有区别给我看(已删除的项目)

这是下面我想要实现的代码:

 var completedList = [{id:1},{id:2},{id:3},{id:4},{id:7},{id:8}];
    var invalidList = [{id:3},{id:4},{id:5},{id:6}];

    // filter the items from the invalid list, out of the complete list
    var validList = completedList.map((item) => {
        console.log(item.id)
        return item.id;
        //console.log(invalidList.id);
    }).filter(item => {
        Object.keys(invalidList).map(key => {
            console.log(invalidList[key].id)
            //return !invalidList[key].id.includes(item.id);
        });
    })

    console.log(validList); // Print [1,2,7,8]

    // get a Set of the distinct, valid items
    var validItems = new Set(validList);

但是这给了我很多id's的提示,我该如何映射数组和对象属性id的过滤器?并且仅显示这些数组对象之间的区别。

所以基本上,我期望看到的是这些数组之间的差异,因此请记录本示例中id的差异:1,2,5,6,7,8

4 个答案:

答案 0 :(得分:1)

您可以选择Set来获得与众不同。为了获得彼此的差异(对称差异),您需要同时获得两个差异。

const
    difference = (a, b) => Array.from(b.reduce((s, v) => (s.delete(v), s), new Set(a))),
    getId = ({ id }) => id;

var completedList = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 7 }, { id: 8 }],
    invalidList = [{ id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }],
    complete = completedList.map(getId),
    invalid = invalidList.map(getId),
    left = difference(complete, invalid),
    right = difference(invalid, complete),
    result = [...left, ...right]

console.log(result.join(' '));
console.log(left.join(' '));
console.log(right.join(' '));

答案 1 :(得分:1)

这应该可以解决问题。

let completedList = [{id:1},{id:2},{id:3},{id:4},{id:7},{id:8}];
let invalidList = [{id:3},{id:4},{id:5},{id:6}];
// filter the items from the invalid list, out of the complete list
let temp1 = completedList.map(e => e.id);
let temp2 = invalidList.map(e => e.id);
let validList = temp1.filter(e => temp2.indexOf(e) === -1);
// find items only in invalidList
let difference = temp2.filter(e => temp1.indexOf(e) === -1);
console.log(validList); // Print [1,2,7,8]
console.log(difference);

答案 2 :(得分:0)

我经常依靠lodash实现进行比较。 在dash中,您可以按照以下方式完成工作

_。intersectionWith(arr1,arr2,_.isEqual)-为相似  _.differenceWith(arr1,arr2,_.isEqual)-差异

这仅限于使用util库来完成工作。 如果您正在寻找确切的算法,我肯定会花一些时间来开发它,并作为对此文章的评论进行答复。

谢谢

答案 3 :(得分:0)

LIKE