Muszę znaleźć tablice, w których wszystkie wartości są równe. Jaki jest najszybszy sposób to zrobić? Czy powinienem przez to przejść i po prostu porównać wartości?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
javascript
jquery
Marvin3
źródło
źródło
a.join(',').split(a[0]).length === a.length + 1
Odpowiedzi:
Lub jednowarstwowy:
Array.prototype.every (z MDN):
every()
Metoda sprawdza, czy wszystkie elementy w tablicy przechodzą test zaimplementowany przez podaną funkcję.źródło
const everythings_equal = array => array.every(thing => thing === array[0]);
some
zamiastevery
:arr.some( v => v !== arr[0] )
. Wróci wcześniej, gdy pierwszy element będzie nierównyarr[0]
.every
również szybko wraca.Edycja: Bądź czerwonym ninja:
Wyniki:
Ostrzeżenie:
Wynika to z faktu, że nie przekazujemy wartości początkowej . Więc możesz
array.length
najpierw sprawdzić .źródło
false
s! na przykład spróbuj [false, false, false] .reduce (function (a, b) {return (a === b)? a: false;});["false", ""]
zwracatrue
: /NaN
. Ponieważ obaNaN === NaN
iNaN !== NaN
są fałszywe, to gwarantuje, że gdyprev
jest ustawiony na wartość NaN wtedy nie można go wyjąć. Również dodanie podwójnej negacji przekształca wyniki natrue
ifalse
, ponieważNaN
jest to fałsz. Forma końcowa:!!array.reduce(function(a, b){ return (a === b) ? a : NaN; });
To działa. Metodę tworzy się na macierzy przy użyciu prototypu.
Nazwij to w ten sposób:
źródło
Array.prototype
grzywny (nawet IE6). To tylko prototypy elementów DOM, że niektóre starsze wersje IE nie obsługują rozszerzania.allValuesSame
do pętliW JavaScript 1.6 możesz użyć
Array.every
:Prawdopodobnie potrzebujesz pewnych sprawdzeń poprawności, np. Gdy tablica nie ma elementów. (Również to nie zadziała, gdy wszystkie elementy są
NaN
odtądNaN !== NaN
, ale to nie powinno być problemem ... prawda?)źródło
Możesz zmienić tablicę w zestaw. Jeśli rozmiar zestawu jest równy 1, wówczas wszystkie elementy tablicy są równe.
źródło
allEqual([NaN, NaN])
dajetrue
to w tym przypadku.I dla porównania wydajności zrobiłem też test porównawczy:
Wyniki:
Najwyraźniej użycie wbudowanej array.some () jest najszybszą metodą z tych, z których próbkowano.
źródło
Array#some
czasami osiąga lepsze wyniki, jest to, że gdy funkcja zwrotna zwraca wartość true, przestaje iterować. Tak więc, jeśli wszystkie elementy są w rzeczywistości równe, wydajność powinna być identycznaArray#every
. Względna wydajność, gdy wszystkie elementy nie są równe, będzie się różnić w zależności od indeksu pierwszego niepasującego elementu.Najkrótsza odpowiedź przy użyciu podkreślenia / lodash
spec:
edytować:
Lub nawet krócej, zainspirowany odpowiedzią Toma:
spec:
źródło
Jeśli już używasz underscore.js , oto inna opcja, używając
_.uniq
:_.uniq
zwraca wersję tablicy bez duplikatów. Jeśli wszystkie wartości są takie same, długość będzie wynosić 1.Jak wspomniano w komentarzach, biorąc pod uwagę, że możesz spodziewać się zwrócenia pustej tablicy
true
, powinieneś również sprawdzić ten przypadek:źródło
false
. Chociaż myślę, że tak powinno byćtrue
. Zmiana na.length <= 1
musi być na tyle chociaż.Tak, możesz to sprawdzić również za pomocą filtra, jak poniżej, bardzo proste, sprawdzanie, czy wszystkie wartości są takie same jak pierwsza:
Można to również zrobić za pomocą każdej metody w tablicy:
i możesz sprawdzić swoje tablice, jak poniżej:
Możesz też dodać go do natywnych funkcji Array w JavaScript, jeśli często go użyjesz:
i możesz sprawdzić swoje tablice, jak poniżej:
źródło
Możesz użyć,
Array.every
jeśli obsługiwane:Alternatywne podejście do pętli może być podobne
sort
Lub, jeśli przedmioty są jak pytanie, coś brudnego jak:
Działa również.
źródło
equals = !array.some( (v,i,a) => v!==a[0] )
. W przeciwnym razie sprawdzasz tylko, czy jakakolwiek wartość jest równa pierwszej, co oczywiście zawsze będzie prawdziwe :)some
zamiast,every
jak wspomniałem w pierwszym akapicie. :) Dzięki za połów!Możesz uzyskać ten jeden wiersz do robienia tego, co chcesz, korzystając z funkcji strzałek Array.prototype.every , Object.is i ES6:
źródło
Myślę, że najprostszym sposobem na to jest utworzenie pętli, aby porównać każdą wartość z następną. Dopóki nastąpi przerwa w „łańcuchu”, wówczas zwróci wartość false. Jeśli pierwszy jest równy drugiemu, drugi równy jest trzeciemu itd., Możemy stwierdzić, że wszystkie elementy tablicy są sobie równe.
biorąc pod uwagę dane tablicy [], możesz użyć:
źródło
źródło
Zaktualizuj nowe rozwiązanie: sprawdź indeks
Zaktualizowany z ES6: użycie
list.every
jest najszybszym sposobem:stara wersja:
źródło
Możesz użyć tego:
Funkcja najpierw sprawdza, czy tablica jest pusta. Jeśli tak, to jego wartości są równe. W przeciwnym razie filtruje tablicę i pobiera wszystkie elementy, które różnią się od pierwszego. Jeśli nie ma takich wartości => tablica zawiera tylko równe elementy, inaczej nie.
źródło
_.isEqual(object, other)
Funkcja podkreślenia wydaje się działać dobrze dla tablic. Kolejność elementów w tablicy ma znaczenie przy sprawdzaniu równości. Zobacz http://underscorejs.org/#isEqual .źródło
źródło
To proste. Utwórz funkcję i przekaż parametr. W tej funkcji skopiuj pierwszy indeks do nowej zmiennej. Następnie utwórz pętlę for i wykonaj pętlę przez tablicę. Wewnątrz pętli utwórz pętlę while z warunkiem sprawdzającym, czy nowa utworzona zmienna jest równa wszystkim elementom w pętli. jeśli jego równość zwraca true po zakończeniu pętli for, w przeciwnym razie zwraca false w pętli while.
źródło
Akceptowane odpowiedź działał świetnie, ale chciałem dodać odrobinę. Nie działało dla mnie,
===
ponieważ porównywałem tablice obiektów, jednak w mojej aplikacji korzystałem z pakietu szybkiego i głębokiego równości , który bardzo polecam. Dzięki temu mój kod wygląda następująco:a moje dane wyglądają tak:
źródło
I jesteś GOTOWY!
źródło
Teraz możesz łatwo korzystać z zestawów.
źródło
Możesz użyć pętli for:
źródło
To naprawdę nie jest bardzo skomplikowane. Mam silne podejrzenia, że nawet nie próbowałeś. Robisz to, że wybierasz pierwszą wartość, zapisujesz ją w zmiennej, a następnie, w
for
pętli, porównujesz wszystkie kolejne wartości z pierwszą.Celowo nie udostępniłem żadnego kodu. Znajdź sposób
for
użycia i porównania zmiennych.źródło
Proste rozwiązanie jednowierszowe, wystarczy porównać je z tablicą wypełnioną pierwszym wpisem.
źródło
Kolejny interesujący sposób korzystania ze składni funkcji strzałek ES6:
A jeśli nie chcesz ponownie użyć zmiennej dla tablicy (x):
Poprzedni plakat IMO, który używał tablicy. Każde (...) ma najczystsze rozwiązanie.
źródło
źródło
to może zadziałać, możesz również użyć kodu komentowania, który również dobrze działa w danym scenariuszu.
źródło
Inny sposób z ograniczonym rozmiarem i uporządkowaną listą:
tablica 1 = [1,2,3]; tablica 2 = [1,2,3];
źródło
Możesz przekonwertować tablicę na zestaw i sprawdzić jej rozmiar
W przypadku prymitywnych wpisów tablicy, to znaczy
number
,string
:W przypadku tablicy obiektów z pewnym polem do przetestowania pod kątem równoważności, powiedz
id
:źródło
W PHP istnieje rozwiązanie bardzo proste, metoda jednoliniowa:
(liczba (wartości_licznika_wartości ($ tablica)) == 1)
Na przykład :
To wszystko.
źródło