如何找到两组对象的差异?

时间:2015-07-31 15:21:36

标签: javascript loops object for-loop

鉴于这两个对象

var obj1 = [{ number: 23, team: 'Bulls', lastname: 'Jordan'}];
var obj2 = [{ number: 23, team: 'Bulls', lastname: 'Jordan'}, {number: 23, team: 'Cavaliers', lastname: 'James'}];

如何迭代两者以返回差异,在本例中为

{number: 23, team: 'Cavaliers', lastname: 'James'}

我已经设置了一些效果

var difference = {};
if (obj2.length > obj1.length) {
    for (var i = 0; i < obj2.length; i++) {
        for (var j in obj2[i]) {
            for (var k in obj1[i]) {
                if (!(obj2[i][j] === obj1[i][k])) {
                    difference.push(obj2[i][j]);
                }
            }
        }
    }
}

我明白为什么这是错误的,我似乎无法弄清楚如何同时循环第一个和第二个对象的键来比较它们来修复它。

3 个答案:

答案 0 :(得分:2)

如果My-Function : Parameter set cannot be resolved using the specified named parameters. At line:1 char:3 + My-Function <<<< aaa -OwnedBy sss + CategoryInfo : InvalidArgument: (:) [My-Function], ParameterBindingException + FullyQualifiedErrorId : AmbiguousParameterSet,My-Function obj2相同但推送了其他项目,那么这些更改就是:

obj1

答案 1 :(得分:2)

你的循环非常低效。我不确定你从哪里获取数据,但如果你自己定义结构,我建议改变结构,使每个'对象'实际上是一个对象,而不是一个数组,每个'播放器'对象具有特定于该播放器的唯一ID。

例如,您可能会重新定义这样的结构:

   obj1 = {};

   obj1.mJordan = new ConstructorForPlayer(23, "Bulls", "Jordan");

因此,当您遍历时,您可以使用for ... in:

   for (var player in obj1){
     if (typeof obj2[player] !== 'undefined'){
       //some equality function here,
       //possibly defined in the prototype for the player object
     } else {
       changes.push(obj1[player]);
     }
   }

我也不确定您是如何尝试跟踪更改的,或者是否将整个新对象放入changes数组中是否需要格式化,但我认为您的主要问题是数据之一结构

答案 2 :(得分:1)

花哨的LINQ式答案:

Array.prototype.any = function(obj){
    for(var item in this){
        var test = false;
        for(var name in this[item]){
            test = obj[name] === this[item][name];
        }
        if(test)
            return test;
    }
    return false;
};

//usage
obj2.any(obj1[0]);