2015-02-25 26 views
5

Ho due array di javascript e ho bisogno di confrontarli. Ad esempio, supponiamo di avere queste due matrici:Confronto elementi di due array

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

Questi array sono uguali in fatto e voglio ottenere true come risultato della comparazione. Qual è il modo migliore e più veloce per farlo?

+1

L'array può avere lo stesso valore ripetuto? – Vaibhav

+0

Sì, forse hanno qualche valore ripetuto. – hamed

+1

Spero sinceramente che i downvotes sottostanti non siano venuti da te, OP. – Passerby

risposta

2

Il modo migliore e il modo più rapido per eseguire questa operazione è l'utilizzo di oggetti che mantengono il valore e il conteggio delle tracce. Quindi possiamo vedere se esiste nel secondo array. Prova questa

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

Posso conoscere il motivo del downvote? – Vaibhav

2

Cosa hai davvero sono due set, non array, ma purtroppo JavaScript non fornisce alcun tipo di tipo di dati "set". Il modo più semplice per eseguire questo tipo di controllo è utilizzare una sorta di libreria JavaScript funzionale, come ad esempio lodash.

L'utilizzo di lodash's _.union function rende tutto ciò semplice.

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

Se si vuole fare questo senza librerie esterne, è possibile farlo utilizzando Array.prototype.every.

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

Prova a rimuovere gli elementi di corrispondenza fino a quando entrambi gli elementi sono vuoti:

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

La risposta di Vaibhav è più efficiente, ma non può ancora sopravvivere. –

0

non credo che sia un approccio più veloce, ma può essere utile per un po 'array con primitive

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(); 

}