Mam te dwie tablice: jedna jest wypełniona informacjami z żądania Ajax, a druga przechowuje przyciski, na które klika użytkownik. Używam tego kodu (wypełniłem przykładowe numery):
var array1 = [2, 4];
var array2 = [4, 2]; //It cames from the user button clicks, so it might be disordered.
array1.sort(); //Sorts both Ajax and user info.
array2.sort();
if (array1==array2) {
doSomething();
}else{
doAnotherThing();
}
Ale zawsze daje false
, nawet jeśli dwie tablice są takie same, ale mają inną nazwę. (Sprawdziłem to w konsoli JS Chrome). Czy jest więc jakiś sposób, abym mógł wiedzieć, czy te dwie tablice zawierają to samo? Dlaczego to daje false
? Skąd mam wiedzieć, których wartości w pierwszej tablicy nie ma w drugiej?
javascript
arrays
compare
Carlos Precioso
źródło
źródło
Odpowiedzi:
Zauważ, że nie modyfikuje to oryginalnych tablic w przeciwieństwie do poprzedniej odpowiedzi.
źródło
Jeśli elementy twojej tablicy nie są obiektami - jeśli są to na przykład liczby lub ciągi znaków, możesz porównać ich połączone ciągi, aby sprawdzić, czy mają te same elementy członkowskie w dowolnej kolejności -
źródło
['a', 'b']
i['a,b']
. Poleciłbym tę technikę tylko w przypadku małych jednorazowych skryptów.Jeśli chcesz sprawdzić tylko, czy dwie tablice mają te same wartości (niezależnie od liczby wystąpień i kolejności każdej wartości), możesz to zrobić za pomocą lodash :
Krótkie, proste i ładne!
źródło
xor
w podkreślonych dokumentach? Myślisz o IODash?Może?
źródło
Dlaczego twój kod nie działa
JavaScript ma prymitywne typy danych i inne niż pierwotne typy danych.
W przypadku pierwotnych typów danych
==
i===
sprawdź, czy elementy po obu stronach słupków mają tę samą wartość. Dlatego1 === 1
to prawda.W przypadku nieprymitywnych typów danych, takich jak tablice,
==
i===
sprawdź równość odwołań. Oznacza to, że sprawdzają, czyarr1
iarr2
są tym samym obiektem. W Twoim przykładzie dwie tablice mają te same obiekty w tej samej kolejności, ale nie są równoważne.Rozwiązania
Dwie tablice
arr1
iarr2
mają te same elementy członkowskie wtedy i tylko wtedy, gdy:arr2
jest w środkuarr1
I
arr1
jest w środkuarr2
Więc to załatwi sprawę (ES2016):
To drugie rozwiązanie wykorzystujące podkreślenie jest bliższe temu, co próbujesz zrobić:
Działa, ponieważ
isEqual
sprawdza „głęboką równość”, co oznacza, że szuka czegoś więcej niż tylko równości odniesienia i porównuje wartości.Rozwiązanie trzeciego pytania
Zapytałeś również, jak dowiedzieć się, które rzeczy
arr1
nie są zawarte warr2
.To wystarczy (ES2015):
Możesz także użyć Underscore
difference
: metoda:AKTUALIZACJA
Zobacz komentarz @ Redu - moje rozwiązanie jest dla
sameMembers
, ale to, co możesz mieć na myśli, jestsameMembersInOrder
również znane jakodeepEquals
.AKTUALIZACJA 2
Jeśli nie przejmujesz się kolejnością członków tablic, ES2015 +
Set
może być lepszą strukturą danych niżArray
. Zobacz notatki MDN o tym, jak wdrożyćisSuperset
idifference
używać niebezpiecznych małp łatania.źródło
sameMembers([1,1,2],[2,1,2]);
powinno zwrócić false.sameMembers([1,1,2],[2,1,2])
powinien wrócićtrue
, moim zdaniem.sameMembersInOrder([1,1,2],[2,1,2])
AKAdeepEquals([1,1,2],[2,1,2])
powinien wrócićfalse
.arr1.filter...
będzie działać tylko w celu sprawdzenia, czy arr2 ma wszystkie elementy arr1, czy nie, ale nie na odwrót, co jest również wymagane.Sprawdzenie równości obiektów:
JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())
Powyższy test działa również z tablicami obiektów, w którym to przypadku użyj funkcji sortowania, jak opisano w http://www.w3schools.com/jsref/jsref_sort.asp
Może wystarczyć dla małych tablic z płaskimi schematami JSON.
źródło
Naszym celem jest po prostu sprawdzenie, czy 2 tablice są równymi zbiorami. zbiór to zbiór zdefiniowany matematycznie . Najszybsze sortowanie asymptotycznie zajmuje O (nlog (n)) czasu. Więc jeśli posortujesz tablicę, zajmie to co najmniej O (nlog (n)) czasu. Ale możesz wykonać to zadanie szybciej , co asymptotycznie zajmuje O (n) czasu (przypadek średni, a nie najgorszy przypadek) ze słownikową strukturą danych. W JS słownik to po prostu obiekt zawierający klucze i wartości.
Zauważ, że ta funkcja działa z tablicami typów pierwotnych oraz zakłada
a1
ia2
jest tablicami.źródło
areArraysEqualSets([1, 2, 2], [1, 2])
areArraysEqualSets([1, 2, 2], [1, 2]) true
Matematycznie są to równe zbiory.A co z tym? ES 2017 przypuszczam:
Pierwszy warunek sprawdza, czy obie tablice mają taką samą długość, a drugi warunek sprawdza, czy pierwsza tablica jest podzbiorem drugiej tablicy. Połączenie tych 2 warunków powinno skutkować porównaniem wszystkich pozycji z 2 tablic, niezależnie od kolejności elementów.
Powyższy kod będzie działał tylko wtedy, gdy obie tablice mają niepowtarzalne elementy.
źródło
Kiedy porównujesz te dwie tablice, porównujesz obiekty, które reprezentują tablice, a nie zawartość.
Będziesz musiał użyć funkcji, aby porównać te dwa. Możesz napisać własny, który po prostu zapętla jeden i porównuje go z drugim po sprawdzeniu, czy długości są takie same.
źródło
Proste rozwiązanie dla płytkiej równości przy użyciu ES6:
Tworzy płytkie kopie każdej tablicy i sortuje je. Następnie używa
some()
do zapętlaniaarr1test
wartości, porównując każdą wartość z wartościąarr2test
z tego samego indeksu. Jeśli wszystkie wartości są równe,some()
zwracafalse
i z kolei zwracaequal
wartośćtrue
.Można również użyć
every()
, ale musiałby cyklicznie przechodzić przez każdy element tablicy, aby spełnićtrue
wynik, podczas gdysome()
baile, gdy tylko znajdzie wartość, która nie jest równa:źródło
Miałem proste wartości całkowite w projekcie Game.
Miałem mniejszą liczbę wartości w każdej tablicy, potrzebowałem też nienaruszonej oryginalnej tablicy.
Zrobiłem więc poniższe, działało dobrze. (Kod edytowany do wklejenia tutaj)
Mam nadzieję, że to pomoże.
źródło
Korzystanie z ES6
Użyjemy
equals
funkcji Ramdy , ale zamiast tego możemy użyć funkcji Lodash lub UnderscoreisEqual
:Korzystając z narzędzia rozprzestrzeniania, unikamy mutowania oryginalnych tablic i utrzymujemy naszą funkcję w czystości.
źródło
Możesz użyć
reduce
zamiast pętli, aby wyglądać sprytnie, ale ryzykujesz, że inni programiści pomyślą o Tobie jako o mądrym dupku.źródło
Większość innych rozwiązań używa sortowania, O (n * log n), korzysta z bibliotek lub ma złożoność O (n ^ 2).
Oto rozwiązanie w czystym Javascript z liniową złożonością, O (n):
Testy:
źródło
compareArrays(['1'], [1])
lubcompareArrays([2, 2], [1, 2])
compareArrays([1, 2], [2, 2])
, zwraca false, więc twoja funkcja nie jest przemienna; Co, jak sądzę, jest nieoczekiwane w takiej funkcji.Jeśli korzystasz z Prototype Framework, możesz użyć metody intersect tablicy, aby dowiedzieć się, czy są takie same (niezależnie od kolejności):
źródło
[1,2].intersect([1,2,3]).length === [1,2].length
zwraca prawdę. Powinieneś także porównać długość oryginalnych tablic, zredagowałem post, aby zademonstrować.array1 = [1,1,2]; array2 = [1,1,2];
... oryginalna odpowiedź nie zawiedzie dla tego wejścia._.difference(array1, array2).length;
uprzejmie sprawdź tę odpowiedź
źródło
return
będzie miało żadnego efektu. Po drugie, należy sprawdzić posortowane tablice, ponieważ[1,2]
i[2,1]
zostaną wykryte jako różne. Po trzecie i najważniejsze, to faktycznie sprawdzi tylko, czy jakiś element jest taki sam. Warunek powinien byćif (array1!==array2) {return false;}
. Może to pomoże Ci w przyszłości!array1
iarray2
można zmienić nazwęelem1
ielem2
. Obie te wskazówki pozwolą Ci zaoszczędzić wielu bólów głowy w przyszłości!Odpowiadam po długim czasie, ale mam nadzieję, że pomoże to komuś, kto szuka prostego rozwiązania i nowoczesnych nowicjuszy.
Teraz możemy to osiągnąć za pomocą wielu bibliotek, takich jak
lodash
,underscore
itp (które staje się częścią projektu w dzisiejszych czasach ze względu na prostotę, wiele funkcji i wysoką użytkowania)Możesz użyć przecięcia z biblioteki lodash.
To zadziała dla każdego typu danych.
źródło
Jeśli chcesz porównać dwie tablice i sprawdzić, czy jakikolwiek obiekt jest taki sam w obu tablicach, zadziała. Przykład:
Array1 = [a, b, c, d]
Array2 = [d, e, f, g]
Tutaj 'd' jest wspólne dla obu tablic, więc ta funkcja zwróci wartość true.
źródło
Spróbuj tego
źródło
Mam inny sposób na podstawie zaakceptowanej odpowiedzi.
źródło
Funkcja porównywania dwóch tablic, aby sprawdzić, czy obie mają te same elementy. Nawet jeśli są niesprawne ...
Jest to dobre dla prostych tablic. [String, Number, Boolean, null, NaN].
Nie używam .sort (), modyfikuje oryginalną tablicę. Niektórzy mówią, że to źle ...
Uwaga. Ta funkcja jest ograniczona, nie może porównywać Obiektów „[], {}” ani funkcji w tych tablicach, tablice, których ona sama jest Obiektem.
źródło
Proste rozwiązanie, aby porównać dwie tablice:
źródło