it-swarm.com.de

verwenden von lodash zum Vergleichen von Arrays (Vorhandensein von Artikeln ohne Bestellung)

Ich weiß, dass ich es mit Schleifen schaffen kann, aber ich versuche, einen eleganten Weg zu finden, dies zu tun:

Ich habe zwei Arrays:

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

Ich möchte mit lodash bestätigen, dass beide gleich sind. Mit "gleich" meine ich, dass es in Array1 kein Element gibt, das nicht in Array2 enthalten ist. 

In Bezug auf die Überprüfung der Gleichheit zwischen diesen Elementen:

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

oder

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

beide arbeiten, da die Buchstaben immer in Ordnung sind.

Danke im Voraus.

74
pQuestions123

Wenn Sie das äußere Array sortieren, können Sie _.isEqual() verwenden, da das innere Array bereits sortiert ist.

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

Beachten Sie, dass .sort() die Arrays mutiert. Wenn dies ein Problem für Sie ist, erstellen Sie zuerst eine Kopie, indem Sie beispielsweise .slice() oder den Spread-Operator (...) verwenden.

Oder machen Sie, wie es Daniel Budick in einem Kommentar empfiehlt:

_.isEqual(_.sortBy(array1), _.sortBy(array2))

Lodashs sortBy() verändert das Array nicht.

146
Trott

Mit "dasselbe" meine ich, dass es in Array1 kein Element gibt, das nicht in Array2 enthalten ist.

Sie können hierfür flatten () und difference () verwenden, was gut funktioniert, wenn es Ihnen egal ist, ob sich in array2 Elemente befinden, die nicht in array1. Es hört sich so an, als würden Sie fragen ist Array1 eine Teilmenge von 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
6
Adam Boduch

PURE JS (funktioniert auch, wenn Arrays und Subarrays mehr als 2 Elemente mit beliebiger Reihenfolge haben). Wenn Strings , enthalten, verwenden Sie als join('-') Parameterzeichen (kann utf sein), das in Strings nicht verwendet wird

array1.map(x=>x.sort()).sort().join() === array2.map(x=>x.sort()).sort().join()

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

var r = array1.map(x=>x.sort()).sort().join() === array2.map(x=>x.sort()).sort().join();

console.log(r);

1

Sie können dazu lodashs xor verwenden

doArraysContainSameElements = _.xor(arr1, arr2).length === 0
0
Stephan Hoyer

Wir können die _.difference-Funktion verwenden, um zu sehen, ob es Unterschiede gibt oder nicht.

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

Ich hoffe, dies wird dir helfen.

0
Amitesh