Различия между этими массивами и как я могу их сравнить? - PullRequest
3 голосов
/ 08 октября 2011

У меня есть два массива, один выглядит так:

["ssewweewewzad0xsis", "sasasaasasaas", "ddwdwd", "ffdfdfdffdfdf", "rffrfrfrfrfrrf", "rffrfrfrffrfrfrfbyzad0xsis
", "dsdssddssd", "ssdsddssd"]

Другой выглядит так:

[
Array[8]
0: "ssdsddssd"
1: "dsdssddssd"
2: "rffrfrfrffrfrfrfbyzad0xsis↵"
3: "rffrfrfrfrfrrf"
4: "ffdfdfdffdfdf"
5: "ddwdwd"
6: "sasasaasasaas"
7: "ssewweewewzad0xsis"
length: 8
__proto__: Array[0]

(взято из консоли разработчика в Chrome)

В чем различия между ними и как я могу проверить, одинаковы ли они?

Первый из проанализированного JSON, второй var array = new Array(); и его значения добавляются через array.push().

Ответы [ 4 ]

1 голос
/ 08 октября 2011

Я понимаю, что ваш вопрос на самом деле спрашивает: " действительно ли эти две структуры эквивалентны ", а не задает более общий вопрос " как мне написать код для сравнения двух массивов ".

Простой ответ заключается в том, что (за возможным неправильным двухуровневым вложением) эти два массива структурно одинаковы. Однако по какой-то причине один из массивов перевернулся.

Как ты их скопировал? Самый простой способ это просто:

var copy = [];
for (var i = 0; i < orig.length; ++i) {
    copy.push(orig[i]);
}

или даже тривиально:

var copy = [].concat(orig);

Если вместо этого вы использовали следующий (неправильный) код:

for (var i in orig) {
    copy.push(orig[i]);
}

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

1 голос
/ 08 октября 2011

Из вашего скриншота видно, что это массив внутри массива.

Чтобы получить вложенный массив, вы можете использовать theArray[0].

Например:

var arr  = [1, 2, 3], // shows up as [1, 2, 3]
    arr2 = [arr];     // shows up as [ Array[3] ] which you can expand
                      // with the arrow

Тогда:

arr2[0] === arr;

Для сравнения, это зависит от того, ссылаются ли массивы на одно и то же.

Если это так, используйте arr2[0] === arr.

В противном случаеВы можете использовать один из алгоритмов, доступных в Интернете.В Chrome это тоже можно сделать:

var a = [1, 2, 3],
    b = [1, 2, 3];

a === b;          // false
a <= b && a >= b; // true
1 голос
/ 08 октября 2011

Вместо цикла вы можете использовать объединение для сравнения строк.

function checkArrays( arrA, arrB ){

    //check if lengths are different
    if(arrA.length !== arrB.length) return false;


    //slice so we do not effect the orginal
    //sort makes sure they are in order
    //join makes it a string so we can do a string compare
    var cA = arrA.slice().sort().join(""); 
    var cB = arrB.slice().sort().join("");

    return cA===cB;

}

var a = [1,2,3,4,5];
var b = [5,4,3,2,1];
var c = [1,2,3,4];
var d = [1,2,3,4,6];
var e = ["1","2","3","4","5"];  //will return true

console.log( checkArrays(a,b) );  //true
console.log( checkArrays(a,c) );  //false
console.log( checkArrays(a,d) );  //false
console.log( checkArrays(a,e) );  //true

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

function checkArrays( arrA, arrB ){

    //check if lengths are different
    if(arrA.length !== arrB.length) return false;

    //slice so we do not effect the orginal
    //sort makes sure they are in order
    var cA = arrA.slice().sort(); 
    var cB = arrB.slice().sort();

    for(var i=0;i<cA.length;i++){
         if(cA[i]!==cB[i]) return false;
    }

    return true;

}

var a = [1,2,3,4,5];
var b = [5,4,3,2,1];
var c = [1,2,3,4];
var d = [1,2,3,4,6];
var e = ["1","2","3","4","5"];

console.log( checkArrays(a,b) );  //true
console.log( checkArrays(a,c) );  //false
console.log( checkArrays(a,d) );  //false
console.log( checkArrays(a,e) );  //false
1 голос
/ 08 октября 2011

Сначала проверьте, имеют ли оба массива одинаковую длину. Затем выполните оба действия и убедитесь, что все соответствующие значения строго равны (===).

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