Muszę sprawdzić tablicę JavaScript, aby zobaczyć, czy istnieją jakieś zduplikowane wartości. Jak najłatwiej to zrobić? Muszę tylko dowiedzieć się, jakie są zduplikowane wartości - tak naprawdę nie potrzebuję ich indeksów ani ile razy są one duplikowane.
Wiem, że mogę przeglądać tablicę i sprawdzać wszystkie pozostałe wartości, ale wydaje się, że powinien istnieć łatwiejszy sposób.
Podobne pytanie:
javascript
arrays
Scott Saunders
źródło
źródło
Odpowiedzi:
Możesz posortować tablicę, a następnie uruchomić ją, a następnie sprawdzić, czy następny (lub poprzedni) indeks jest taki sam jak bieżący. Zakładając, że Twój algorytm sortowania jest dobry, powinno być mniejsze niż O (n 2 ):
W przypadku, jeśli chcesz powrócić jako funkcja dla duplikatów. Dotyczy to podobnych przypadków.
Odniesienie: https://stackoverflow.com/a/57532964/8119511
źródło
arr = [9, 9, 9, 111, 2, 3, 3, 3, 4, 4, 5, 7];
i++
. Zamiast tego mówią, żeby nie pisaćj = i + +j
. Dwie różne rzeczy IMHO. Myślę, żei += 1
jest to bardziej mylące niż proste i pięknei++
:)var sorted_arr = arr.sort()
jest bezużyteczny:arr.sort()
mutuje oryginalną tablicę (co samo w sobie jest problemem). To także odrzuca element. (Uruchom powyższy kod. Co się stanie z 9?) Cc @dystroy Czystszym rozwiązaniem byłobyresults = arr.filter(function(elem, pos) { return arr.indexOf(elem) == pos; })
Jeśli chcesz usunąć duplikaty, wypróbuj to świetne rozwiązanie:
Źródło: http://dreaminginjavascript.wordpress.com/2008/08/22/ Eliminating-duplicates/
źródło
Oto moja odpowiedź ze zduplikowanego wątku (!):
Pisząc ten wpis 2014 - wszystkie przykłady dotyczyły pętli lub jQuery. JavaScript ma do tego idealne narzędzia: sortuj, mapuj i zmniejszaj.
Znajdź zduplikowane elementy
Bardziej funkcjonalna składnia:
@ Dmytro-Laptin wskazał, że należy usunąć część kodu. To jest bardziej kompaktowa wersja tego samego kodu. Korzystanie z niektórych sztuczek ES6 i funkcji wyższego rzędu:
źródło
Znajdź zduplikowane wartości w tablicy
To powinien być jeden z najkrótszych sposobów, aby faktycznie znaleźć zduplikowane wartości w tablicy. Jak wyraźnie zażądał PO, nie usuwa to duplikatów, ale je odnajduje .
Nie wymaga to sortowania ani żadnych struktur zewnętrznych. Nie potrzebuje też ręcznych pętli. Działa z każdą wartością indexOf () (lub ściślej: operator ścisłego porównania ).
Ze względu na redukcję () i indexOf () potrzebuje co najmniej IE 9.
źródło
const dupes = items.reduce((acc, v, i, arr) => arr.indexOf(v) !== i && acc.indexOf(v) === -1 ? acc.concat(v) : acc, [])
Możesz dodać tę funkcję lub dostosować ją i dodać do prototypu JavaScript Array:
źródło
ZAKTUALIZOWANO: Poniżej zastosowano zoptymalizowaną połączoną strategię. Optymalizuje pierwotne wyszukiwania, aby skorzystać z czasu wyszukiwania skrótu O (1) (uruchamianie
unique
na tablicy prymitywów to O (n)). Wyszukiwanie obiektów jest optymalizowane poprzez oznaczanie obiektów unikalnym identyfikatorem podczas iteracji, więc identyfikacja zduplikowanych obiektów to także O (1) na element i O (n) dla całej listy. Jedynym wyjątkiem są elementy, które są zamrożone, ale są one rzadkie, a awaryjne zapewnia się za pomocą tablicy i indexOf.Jeśli masz dostępne kolekcje ES6, istnieje o wiele prostsza i znacznie szybsza wersja. (podkładka dla IE9 + i innych przeglądarek tutaj: https://github.com/Benvie/ES6-Harmony-Collections-Shim )
źródło
ZAKTUALIZOWANY: Krótki jednowarstwowy, aby uzyskać duplikaty:
Aby uzyskać tablicę bez duplikatów, po prostu odwróć warunek:
Po prostu nie myślałem o tym
filter()
w mojej starej odpowiedzi poniżej;)Gdy wszystko, czego potrzebujesz, to sprawdzić, czy nie ma duplikatów zgodnie z pytaniem w tym pytaniu , możesz użyć
every()
metody:Pamiętaj, że
every()
nie działa dla IE 8 i niższych.źródło
źródło
'a'
w tablicy, funkcja filtra wewnątrzindex == 1
, natomiastself.indexOf('a') == 0
To powinno dać ci to, czego chcesz, tylko duplikaty.
źródło
using underscore.js
źródło
ES2015
Znajdź unikalne wartości z 3 tablic (lub więcej):
Tylko polifill dla indeksu tablicowego dla starych przeglądarek:
Rozwiązanie jQuery przy użyciu „inArray”:
zamiast dodawać
Array.prototype.indexOf
źródło
var r = [];
aby twój kod działał. I działał jak urok.r
zmiennejOto moje proste i jedno liniowe rozwiązanie.
Najpierw przeszukuje nie unikalne elementy, a następnie czyni tablicę unikalną za pomocą Set.
Mamy więc na końcu szereg duplikatów.
źródło
Oto moja propozycja (ES6):
źródło
undefined
jest duplikatem.lub po dodaniu do prototyp.chain Array
Zobacz tutaj: https://gist.github.com/1305056
źródło
i&&
ma to na celu uniknięcie przekroczenia granicy tablicy, ale oznacza to również, że pierwszy element w posortowanej tablicy nie zostanie uwzględniony. W twoim przykładzie nie ma1
wynikowej tablicy. Toreturn i&&v!==o[i-1]?v:0;
return v!==o[i-1];
Szybki i elegancki sposób z wykorzystaniem destrukcji i redukcji obiektów es6
Działa w O (n) (1 iteracja po tablicy) i nie powtarza wartości, które pojawiają się więcej niż 2 razy
źródło
Oto najprostsze rozwiązanie, jakie mogłem wymyślić:
Otóż to.
Uwaga:
Działa z dowolnymi liczbami, w tym
0
ciągami i liczbami ujemnymi, np.-1
- Powiązane pytanie: Uzyskaj wszystkie unikalne wartości w tablicy JavaScript (usuń duplikaty)Oryginalna tablica
arr
zostaje zachowana (filter
zwraca nową tablicę zamiast modyfikować oryginał)filtered
Tablica zawiera wszystkie duplikaty; to może również zawierać więcej niż 1 samą wartość (np naszą filtrowanego układ jest tu[ 2, 2, 0, 0, -1, 'a', 'a' ]
)Jeśli chcesz uzyskać tylko wartości, które są zduplikowane (nie chcesz mieć wielu duplikatów o tej samej wartości), możesz użyć
[...new Set(filtered)]
(ES6 ma zestaw obiektów, który może przechowywać tylko unikalne wartości)Mam nadzieję że to pomoże.
źródło
Najkrótsza waniliowa JS :
źródło
Oto bardzo lekki i łatwy sposób:
źródło
Za pomocą ES6 (lub używając Babel lub Typescipt) możesz po prostu:
https://es6console.com/j58euhbt/
źródło
Prosty kod ze składnią ES6 (zwraca posortowaną tablicę duplikatów):
Jak używać:
źródło
jedna wkładka
źródło
indx!
dla pierwszego przykładu?indx !== ...
- ścisłą nierówność.result.filter((ele,indx) => indx !== result.map(e => e.name).indexOf(ele.name));
Ta odpowiedź może być również pomocna, wykorzystuje
reduce
operatora / metodę js do usuwania duplikatów z tablicy.źródło
new Set([1, 2, 2, 3, 3, 3, 3])
aby usunąć duplikatyNastępująca funkcja (wspomniana już odmiana funkcji eliminacji duplikatów) wydaje się załatwić sprawę, zwracając test2,1,7,5 dla danych wejściowych [„test”, „test2”, „test2”, 1, 1, 1, 2 , 3, 4, 5, 6, 7, 7, 10, 22, 43, 1, 5, 8]
Zauważ, że problem jest dziwniejszy w JavaScript niż w większości innych języków, ponieważ tablica JavaScript może pomieścić prawie wszystko. Zwróć uwagę, że rozwiązania wykorzystujące sortowanie mogą wymagać zapewnienia odpowiedniej funkcji sortowania - jeszcze nie próbowałem tej trasy.
Ta konkretna implementacja działa dla (przynajmniej) ciągów i liczb.
źródło
Tylko ES5 (tzn. Wymaga wypełnienia filtra () dla IE8 i niższych):
źródło
Ta funkcja unika kroku sortowania i używa metody redukowania () do wypychania duplikatów do nowej tablicy, jeśli jeszcze w niej nie istnieje.
źródło
Jest to prawdopodobnie jeden z najszybszych sposobów na trwałe usunięcie duplikatów z tablicy 10 razy szybciej niż większość funkcji tutaj. I 78 razy szybciej w safari
jeśli nie możesz odczytać powyższego kodu, zapytaj, przeczytaj książkę javascript lub oto wyjaśnienia dotyczące krótszego kodu. https://stackoverflow.com/a/21353032/2450730
EDYCJA Jak stwierdzono w komentarzach, funkcja zwraca tablicę z unikatami, jednak pytanie wymaga znalezienia duplikatów. w takim przypadku prosta modyfikacja tej funkcji pozwala na wypchnięcie duplikatów do tablicy, a następnie użycie poprzedniej funkcji
toUnique
usuwa duplikaty duplikatów.źródło
Użycie „obejmuje”, aby sprawdzić, czy element już istnieje.
źródło
ES6 oferuje strukturę danych Set, która jest w zasadzie tablicą, która nie przyjmuje duplikatów. Dzięki strukturze danych Set istnieje bardzo łatwy sposób na znalezienie duplikatów w tablicy (przy użyciu tylko jednej pętli).
Oto mój kod
źródło
Właśnie wymyśliłem prosty sposób na osiągnięcie tego za pomocą filtra Array
źródło
Przestrzeganie logiki będzie łatwiejsze i szybsze
Zalety :
Opis logiki:
Uwaga: metody map () i filter () są wydajne i szybsze.
źródło