Wiem, że mogę to zrobić za pomocą pętli, ale staram się znaleźć elegancki sposób na zrobienie tego:
Mam dwie tablice:
var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
Chcę użyć, lodash
aby potwierdzić, że powyższe dwie tablice są takie same. Przez „ten sam” mam na myśli, że nie ma w nim elementu, array1
który nie jest zawarty w array2
.
Jeśli chodzi o sprawdzanie równości między tymi elementami:
['a', 'b'] == ['b', 'a']
lub
['a', 'b'] == ['a', 'b']
Oba działają, ponieważ litery zawsze będą w porządku.
źródło
.sort()
mutuje i sugerując opcje kopiowania w pierwszej kolejności, jeśli stanowi to problem dla użytkownika._.isEqual(_.sortBy(array1), _sortBy(array2))
aby zapobiec mutacji.Możesz
xor
do tego użyć lodashJeśli uważasz, że tablica [1, 1] różni się od tablicy [1], możesz nieco poprawić wydajność w następujący sposób:
źródło
_.xor([3,4], [4,3]).length == 0
temu staniesz się prawdą.Można użyć Spłaszczenie () i różnicę () dla tego, który działa dobrze, jeśli nie obchodzi, czy istnieją pozycje
array2
, które nie są warray1
. Wygląda na to, że pytasz, czy tablica1 jest podzbiorem tablicy2 ?źródło
Tutaj są już odpowiedzi, ale oto moja czysta implementacja JS. Nie jestem pewien, czy jest optymalny, ale na pewno jest przejrzysty, czytelny i prosty.
Powodem
contains()
jest to, że jeślia
zawiera wszystkie elementy programub
, to umieszczenie ich w tym samym zestawie nie zmieniłoby rozmiaru.Na przykład, jeśli
const a = [1,2,3,4]
iconst b = [1,2]
wtedynew Set([...a, ...b]) === {1,2,3,4}
. Jak widać, wynikowy zestaw zawiera te same elementy, coa
.Stamtąd, aby uczynić go bardziej zwięzłym, możemy sprowadzić to do następujących:
źródło
PURE JS (działa również, gdy tablice i podtablice mają więcej niż 2 elementy o dowolnej kolejności). Jeśli łańcuchy zawierają znak
,
użyj jakojoin('-')
parametru (może to być utf), który nie jest używany w łańcuchachPokaż fragment kodu
źródło
Możemy użyć
_.difference
funkcji, aby zobaczyć, czy jest jakaś różnica, czy nie.Mam nadzieję, że to Ci pomoże.
źródło
true
zaconsole.log(isSame([1,2], [2,3,1]));
a
ib
zmiennych. Ty tylko korzystać z tych zmiennych wewnątrzif-then
strony, a pierwszą rzeczą, jaką możesz zrobić tam jest odrzucić te wartości załadowane na linii 2. Myślę, że po jednej linii będzie działać dokładnie tak samo:return arrayOne.length <= arrayTwo.length && _.isEmpty(_.difference(arrayTwo.sort(), arrayTwo.sort());
. A<=
można również poprawić się===
._.difference
zwróci brakujące elementy pierwszego argumentu, ale nie brakuje elementów w drugim. Więc to będzie nieprawidłowo powrócićtrue
kiedy powtórzyć przedmioty na 1 w 2:isSame([1, 2, 3], [1, 2, 2])
.Edycja: przegapiłem wielowymiarowy aspekt tego pytania, więc zostawiam to tutaj na wypadek, gdyby pomogło to ludziom porównać jednowymiarowe tablice
To stare pytanie, ale miałem problemy z szybkością używania
.sort()
lubsortBy()
, więc zamiast tego użyłem tego:Miał on szybko zawieść i do moich celów działa dobrze.
źródło
array1.every((str) => array2.includes(str))
powinno wystarczyć. Również OP chciał użyć lodash, powinieneś przynajmniej powiedzieć, dlaczego proponujesz rozwiązanie vanillaJS (... teraz, gdy mamy wszystko i zawiera ...). Proszę również podać przykład, jak zastosować swoją funkcję do podanego problemu (tablice dwuwymiarowe).lodash methods to compare arrays without considering order
aby zobaczyć alternatywę we współczesnym JavaScript. Drugie sprawdzenie jest konieczne, ponieważ warraysContainSameStrings(['1', '2', '2'], ['1', '2', '3'])
przeciwnym razie zwróciłoby true. Zostawię to tutaj, ponieważ może to pomóc, ale doceniam, że nie odpowiedziałem na pytanie