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

时间:2015-03-01 14:38:08

标签: javascript arrays underscore.js

我在我的项目中使用了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}
    
  2. {item: myObject1, label: myObject1.name, ticked: false, disabled: false}
    

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

    1. 这些项目不等于因为第一个元素被勾选而第二个元素没有...所以,返回false;
    2. 我不知道如何用underscore.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);
          }
      

1 个答案:

答案 0 :(得分:1)

我相信这可以胜任。

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});

我很想看到其他方法。