2015-02-25 24 views
5

Mam dwie tablice javascript i muszę je porównać. Na przykład załóżmy, że mam te dwie tablice:Porównaj elementy dwóch tablic

var array1 = ["1", "2", "3", "4"]; 
var array2 = ["4", "1", "3", "2"]; 

Te tablice są równe w rzeczywistości i chcę dostać true w wyniku porównania. Jaki jest najlepszy i najszybszy sposób na zrobienie tego?

+1

Twoja tablica może mieć powtarzaną tę samą wartość? – Vaibhav

+0

Tak, może mają jakąś powtarzającą się wartość. – hamed

+1

Mam szczerą nadzieję, że poniższe opinie nie pochodzą od Ciebie, OP. – Passerby

Odpowiedz

2

Najlepszym sposobem i najszybszym sposobem jest użycie obiektu, który śledzi wartość i jej liczbę. Wtedy możemy zobaczyć, czy istnieje w drugiej tablicy. Spróbuj tego

function compare(arr1, arr2){ 
    var obj={}, len = arr1.length, i=0, isSame=true, prop; 
    if(arr1.length === arr2.length){ 
     for(;i<len;i++){ 
      if(obj[arr1[i]]){ 
       obj[arr1[i]] = obj[arr1[i]]+1; 
      } else{ 
       obj[arr1[i]] =1; 
      } 
     } 
     i=0, len = arr2.length; 
     for(;i<len;i++){ 
      if(obj[arr2[i]]){ 
       obj[arr2[i]] = obj[arr2[i]]-1; 
      } else{ 
       isSame = false; 
       break; 
      } 
     } 
     for (prop in obj){ 
      if(obj[prop] > 0){ 
       isSame = false; 
       break; 
      } 
     } 
    }else{ 
     isSame = false; 
    } 
    return isSame; 

} 
+0

Czy mogę poznać przyczynę porażki? – Vaibhav

2

Co naprawdę masz dwa zestawy, a nie tablice, ale niestety JavaScript nie przewiduje jakichkolwiek „set” typ danych. Najłatwiejszym sposobem na sprawdzenie tego typu jest użycie jakiejś funkcjonalnej biblioteki JavaScript, takiej jak lodash.

Korzystanie z lodash's _.union function czyni to banalnie łatwym.

function setsEqual(a, b) { 
    var u = _.union(a, b); 
    return u.length === a.length && u.length === b.length; 
} 

Jeśli chcesz to zrobić bez zewnętrznych bibliotek, można to zrobić za pomocą Array.prototype.every.

function setsEqual(a, b) { 
    return a.length === b.length 
     && a.every(function (v) { return b.indexOf(v) !== -1; }); 
} 
1

Spróbuj usunąć pasujące elementy, dopóki oba elementy są puste:

var array1 = ["1", "2", "3", "4", "1", "5"]; 
var array2 = ["1", "5", "2", "3", "4", "1"]; 
var isSame = false; 
if(array1.length != array2.length) 
    isSame = false; 
else 
{ 
    for(var i = 0; i < array1.length; i ++) 
    { 
     var removed = false; 
     for(var j = 0; j < array2.length; j ++) 
     { 
      if(array2[j] == array1[i]) 
      { 
       // remove from array2 
       array1.splice(i, 1); 
       // remove from array1 
       array2.splice(j, 1); 
       // go back 1 for i 
       removed = true; 
       i --; 
       break; 
      } 
     } 
     if(!removed) 
      break; 
} 

    if(array1.length == 0 && array2.length == 0) 
     isSame = true; 
} 
+0

Odpowiedź Vaibhav jest bardziej wydajna, nie może jednak zostać przekazana. –

0

Nie sądzę, że jest to najszybszy podejście, ale może to być przydatne dla małych tablic z prymitywów

function compareArrays(a, b) { 
    var copyA = a.slice(), 
     copyB = b.slice(); 

    if (a.length !== b.length) { return false; } 
    return copyA.sort().toString() === copyB.sort().toString(); 

}

Powiązane problemy