javascript - 仅通过带有 underscore.js 的某些字段在对象数组之间进行交集和等于

标签 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}
    

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

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

  • 这些项不等于,因为第一个元素已勾选,而第二个元素没有…因此,返回 false;
  • 我不明白如何使用 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);
        }
    

    最佳答案

    我相信这会完成这项工作。

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

    我很乐意看到其他方法。

    关于javascript - 仅通过带有 underscore.js 的某些字段在对象数组之间进行交集和等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28794764/

    相关文章:

    jquery - Backbone Marionette CompositeView "Event Zombie"

    javascript - 在函数中调用 componentDidMount 是不好的做法吗?

    javascript - 尝试使用 html 和 javascript 显示模态,但单击后没有任何显示

    javascript - 在 <select> 框中选择选项的最正确方法

    javascript - jQuery 数组按下按钮单击

    javascript - 如果一个数组的所有项目存在于另一个数组中,则将其删除

    javascript - 如果我使用慢速模式对象,Object.assign 的结果会处于字典模式吗?

    javascript - 在 session 中放置一个列表并显示每个 session

    javascript按对象键过滤并返回嵌套对象键的值

    jquery - OSX 惯性滚动导致 mousewheel.js 通过最轻微的滚动运动注册多个鼠标滚轮事件