Mam dwie tablice, wygląda na:

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

Drugi wygląda:

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

(Zrobione z konsoli deweloperskiej w Chrome)

Jakie są różnice między nimi a jak mogę sprawdzić, czy są takie same?

Pierwszy jest z analizowany JSON, drugi jest var array = new Array(); i jego wartości są dodawane przez array.push().

3
pmerino 8 październik 2011, 16:26

4 odpowiedzi

Najlepsza odpowiedź

Z ekranu zrzutu jest to tablica wewnątrz tablicy.

Aby uzyskać zagnieżdżoną tablicę, możesz użyć theArray[0].

Na przykład:

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

Następnie:

arr2[0] === arr;

Aby porównać, zależy to od tego, czy tablice odniesienia do tego samego.

Jeśli tak, użyj arr2[0] === arr.

W przeciwnym razie można użyć jednej z algorytmów dostępnych w Internecie. W Chrome możliwe jest również to zrobić:

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

a === b;          // false
a <= b && a >= b; // true
1
pimvdb 8 październik 2011, 13:22

Najpierw sprawdź, czy oba tablice są o tej samej długości. Następnie iteruj przez oba i sprawdzają, czy wszystkie odpowiednie wartości są ściśle równe (===).

1
Aadit M Shah 8 październik 2011, 12:29

Zamiast pętli możesz użyć dołączenia, aby porównać struny.

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

Tylko problem polega na tym, że zależy Ci na typach, które ostatnie testy porównawcze. Jeśli zależy Ci na typach, będziesz musiał pętli.

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
epascarello 8 październik 2011, 12:58

Interpretuję twoje pytanie, jest faktycznie pytanie " są te dwie struktury faktycznie równoważne ", zamiast zadawać bardziej ogólne pytanie " jak pisać kod, aby porównać dwie tablice ".

Prosta odpowiedź jest to, że (z możliwym wyjątkiem niepoprawnego dwustopniowego zagnieżdżania) Dwa tablice są strukturalnie to samo. Jednak z jakiegoś powodu jeden z tablic jest odwrócony.

Jak je skopiowałeś? Najprostszym sposobem jest tylko:

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

Lub nawet trywialnie:

var copy = [].concat(orig);

Jeśli zamiast tego użyłeś następującego (niepoprawnego) kodu:

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

Następnie nakaz wyliczenia nie jest zagwarantowany, co może być dlatego skończyłeś z odwróconą tablicą.

1
Alnitak 8 październik 2011, 13:11