Сравните два массива объектов - PullRequest
0 голосов
/ 27 января 2012

Мне нужно сравнить два массива. Если я проверяю, является ли 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

* Я хотел бы сравнить массив1 с массивом2 по значениям их свойств *

например, если

   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.

Я, вероятно, смогу сделать это, если потрачу на это много наших. Я не очень хорош в алгоритмах и, возможно, есть простой способ сделать это.


редактировать

Я хотел бы знать, какие изменения мне придется внести в массив1, чтобы он стал равным массиву2.

Ответы [ 2 ]

1 голос
/ 27 января 2012

«Делать это равным» звучит как 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]);
    }
}
1 голос
/ 27 января 2012

Использование литеральной нотации вместо псевдокода:

> 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]?

Кажется, что объекты не имеют уникальных идентификаторов или определенного порядка в своих контейнерных массивах, так как узнать, какие из них сравнивать, чтобы определить различия или изменениятребуется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...