只有一些带undercore.js的字段在对象数组之间求交集和等于

Intersection and Equals between arrays of objects by only some fields with underscore.js

本文关键字:之间 数组 对象 undercore 字段 js      更新时间:2023-09-26

我在项目中使用underscore.js,我想比较两个数组,但只比较它们与一个字段的交集。

第一个阵列:

[{item: myObject1, label: myObject1.name, ticked: true, disabled: false}]

第二个阵列:

[{item: myObject1, label: myObject1.name, ticked: false, disabled: false}, 
{item: myObject2, label: myObject2.name, ticked: true, disabled: false}]

我想通过myObject.id返回这些数组的交集并进行比较:

  1. 交叉点:

    {item: myObject1, label: myObject1.name, ticked: true, disabled: false}
    

{item: myObject1, label: myObject1.name, ticked: false, disabled: false}

因为myObject1是交集(myObject1.id==myObject1.id)。

  1. 这些项不相等,因为第一个元素被勾选,第二个不…所以,返回false

我不知道我怎么能用undercore.js.做到这一点

编辑:

只有isEqual函数,我就可以做到这一点(我使用AngularJS):

isIOEquals: function(inputs, outputs){
        var editedInputs = [];
        var editedOutputs = [];
        angular.forEach(outputs, function(outputItem){
            angular.forEach(inputs, function(inputItem){
                if(_.isEqual(inputItem.item.id, outputItem.item.id)){
                    editedInputs.push(inputItem);
                    editedOutputs.push(outputItem);
                }
            });
        });
        return _.isEqual(editedInputs, editedOutputs);
    }

我相信这能完成任务。

function myIntersection() {
    var objectLists = [].slice.call(arguments),
        objMapper = objectLists.pop();
    var flatLists = objectLists.map(function(lst) {
        return lst.map(objMapper);
    });
    // There will be duplicates in this list, but maybe that's the desired
    // behaviour, so I'll leave it to you to sort that out.
    var mergedObjectLists = _.flatten(objectLists);
    var intersectingValues = _.intersection.apply(null, flatLists);
    return mergedObjectLists.filter(function(obj) {
        return intersectingValues.indexOf(objMapper(obj)) !== -1
    });
}
myIntersection(list1, list2, function(obj) {return obj.item.id});

我很想看到其他方法。