比较两个对象数组

时间:2012-01-27 01:37:43

标签: javascript algorithm compare

我需要比较两个数组。如果我测试Object1 == Object2我正在测试对象是否指向内存中的相同地址。我实际上想根据它们的属性值来比较它们。让我告诉你我的意思。

我在javascript中有一个课程:

function MyClass(var1,var2,var3)
{
   this.var1 = var1;
   this.var2 = var2;
   this.var3 = var3;
}

现在我将能够创建该类的新对象:

var myNewObject = new MyClass(1,"hello",3);

我将能够访问该对象的属性:

myNewObject.var2 = "New value";

我有两个数组:

 var array1 = new Array();
 var array2 = new Array();

两个数组都填充了MyClass对象。换句话说,如果array1有3个元素,我知道它们将是MyClass类型,这意味着我可以做类似的事情:array1[2].var1 = foo

* 我想基于其属性值将array1与array2进行比较*

例如

   array1 = [ [1,"hello",4] , [0,"foo",5] ]; 

   array2 = [ [0,"foo",5555] [1111,"hello",4]];

   note: // [1,"hello",4] means a MyClass object with var1=1, var2="hello", var3 = 4

我希望有一种能告诉我变化的方法。在此示例中,var1更改为1111,var3从5更改为5555。

如果我花了很多钱去做,我可能会这样做。我不擅长算法,也许有一种简单的方法。


修改

我想知道我必须对array1进行的更改,以使其等于array2。

2 个答案:

答案 0 :(得分:1)

使用文字符号代替pesudo代码:

> array1 = [ {var1:1, var2:"hello", var3:4},
>            {var1:0, var2:"foo", var3:5}
> ];
> array2 = [ {var1:0, var2:"foo", var3:5555},
>            {var1:1111, var2:"hello", var3:4}
> ]; 
>
> I will like to have a method that will tell me the changes. In
> this example var1 changed to 1111 and var3 changed from 5 to 5555.

您如何知道将第一个数组的第一个成员与第二个数组中的第二个成员进行比较?类似于array1 [1] vs array2 [0]?

对象在容器数组中似乎没有唯一标识符或特定顺序,因此您如何知道要比较哪些对象以确定所需的差异或更改?

答案 1 :(得分:1)

“使其平等”听起来像array1 = array2.slice(0),但这似乎不是你想要的。请尝试以下方法:

for (var i=0, l=Math.max(array1.length, array2.length); i<l; i++) {
    if (! array1[i]) {
        alert("You need to make a copy of "+array2[i]);
        continue;
    }
    if (! array2[i]) {
        alert("You need to delete "+array1[i]);
        continue;
    }
    for (var j in array2[i]) {
        if (array2.hasOwnProperty(i)) // needed only when MyClass has a prototype with enumerable properties
            if (array1[i][j] !== array2[i][j])
                alert("You need to change "+j+" of "+array1[i]);
    }
}