2015-04-29 12 views
50

so che posso farlo utilizzando i loop, ma sto cercando di trovare un modo elegante di fare questo:utilizzando lodash per confrontare array (articoli esistenza senza ordine)

Ho due matrici:

var array1 = [['a', 'b'], ['b', 'c']]; 
var array2 = [['b', 'c'], ['a', 'b']]; 

Voglio usare lodash per confermare che i due sono uguali. Con "lo stesso" intendo che non vi è alcun elemento in array1 che non sia contenuto in array2.

In termini di controllo parità tra questi elementi:

['a', 'b'] == ['b', 'a'] 

o

['a', 'b'] == ['a', 'b'] 

sia il lavoro poiché le lettere saranno sempre in ordine.

Grazie in anticipo.

risposta

90

Se si ordina l'array esterno, è possibile utilizzare _.isEqual() poiché l'array interno è già ordinato.

var array1 = [['a', 'b'], ['b', 'c']]; 
var array2 = [['b', 'c'], ['a', 'b']]; 
_.isEqual(array1.sort(), array2.sort()); //true 

Si noti che .sort() muterà gli array. Se questo è un problema per te, fai prima una copia usando (per esempio) .slice() o l'operatore di spread (...).

+3

Tenere in considerazione che array.sort() sta modificando la matrice originale. Forse questo potrebbe essere migliore: var array1 = [['a', 'b'], ['b', 'c']]; var array2 = [['b', 'c'], ['a', 'b']]; _.isEqual ([... array1] .sort(), [... array2] .sort()); // true –

+2

Aggiunte due frasi notando che '.sort()' muta e suggerisce opzioni per copiare prima se questo è un problema per l'utente. – Trott

5

Con "lo stesso" intendo che non ci sono elementi in array1 che non sono contenuti in array2.

Si potrebbe utilizzare appiattire() e la differenza() per questo, che funziona bene, se non si cura se ci sono articoli in array2 che non sono in array1. Sembra che tu stia chiedendo che sia array1 un sottoinsieme di array2?

var array1 = [['a', 'b'], ['b', 'c']]; 
var array2 = [['b', 'c'], ['a', 'b']]; 

function isSubset(source, target) { 
    return !_.difference(_.flatten(source), _.flatten(target)).length; 
} 

isSubset(array1, array2); // → true 
array1.push('d'); 
isSubset(array1, array2); // → false 
isSubset(array2, array1); // → true 
-1

Possiamo usare la funzione _.difference per vedere se c'è qualche differenza o no.

function isSame(arrayOne, arrayTwo) { 
    var a = arrayOne, 
     b = arrayTwo; 

    if (arrayOne.length <= arrayTwo.length) { 
     a = arrayTwo; 
     b = arrayOne; 
    } 
    return _.isEmpty(_.difference(a.sort(), b.sort())); 
} 

// examples 
console.log(isSame([1, 2, 3], [1, 2, 3])); // true 
console.log(isSame([1, 2, 4], [1, 2, 3])); // false 
console.log(isSame([1, 2], [2, 3, 1])); // false 
console.log(isSame([2, 3, 1], [1, 2])); // false 

Spero che questo ti possa aiutare.

+3

Sbagliato, la tua funzione otterrà 'true' per' console.log (isSame ([1,2], [2,3,1])); ' – DavidLin

+1

Grazie a @DavidLin per indicarlo. Ho fatto le modifiche per considerare quel caso. Grazie e scusa per l'inconveniente. – Amitesh

Problemi correlati