代码之家  ›  专栏  ›  技术社区  ›  Sireini

比较数组对象并显示差异

  •  2
  • Sireini  · 技术社区  · 6 年前

    我有两个数组,我想比较并检查其中一个数组中是否有已删除的项。如果存在差异,请显示差异(已删除项)

    下面是我希望如何实现这一点的代码:

     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的差异,所以在这个例子中: 1,2,5,6,7,8

    4 回复  |  直到 6 年前
        1
  •  1
  •   Nina Scholz    6 年前

    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(' '));
        2
  •  1
  •   Andre Nuechter    6 年前

    这应该能奏效。

    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);
    
        3
  •  0
  •   Jonathon    6 年前

    我经常依赖lodash实现进行比较。 总之,你可以按以下方式完成工作

    _.differenceWith(arr1,arr2,0.isEqual)-表示差异

    如果你正在寻找确切的算法,我肯定会花一些时间来开发它,并作为一个评论回复这篇文章。

    谢谢

        4
  •  0
  •   Tjaart van der Walt    6 年前
    var completedList = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 7 }, { id: 8 }];
    var invalidList = [{ id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }];
    
    //get the items that are in the invalid list but not completed list
    var filteredList1 = invalidList.filter((invalidListItem) => !completedList.find((item) => item.id === invalidListItem.id));
    
    //get the items that are in  the completed list but not in the invalid list
    var filteredList2 = completedList.filter((completedListItem) => !invalidList.find((item) => item.id === completedListItem.id));
    
    //join the two arrays
    var difference = filteredList1.concat(filteredList2);
    
    //display the merged array and sort
    console.log(difference.sort((item1, item2) => { return item1.id > item2.id ? 1 : item1.id < item2.id ? -1 : 0; }));
    
    //outputs 1,2,5,6,7,8