Jak mogę wypchnąć do tablicy, jeśli żadna z wartości nie istnieje? Oto moja tablica:
[
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" }
]
Jeśli spróbuję ponownie wcisnąć do tablicy za pomocą albo, name: "tom"
albo text: "tasty"
nie chcę, żeby coś się wydarzyło ... ale jeśli żadnego z nich nie ma, to chcę.push()
W jaki sposób mogę to zrobić?
javascript
arrays
json
push
not-exists
Tarnfeld
źródło
źródło
Odpowiedzi:
Możesz rozszerzyć prototyp Array za pomocą niestandardowej metody:
źródło
Array.findIndex()
jest wbudowaną funkcją JS, która osiągnie to samo, co Twój kod.W przypadku tablicy ciągów (ale nie tablicy obiektów) możesz sprawdzić, czy element istnieje, wywołując go,
.indexOf()
a jeśli nie, to po prostu wepchnij element do tablicy:źródło
if (a.indexOf({ name: "tom", text: "tasty" })!=-1) a.push({ name: "tom", text: "tasty" })
dwa razy. Dwukrotnie doda „podobny” obiekt.Jest to dość łatwe przy użyciu
Array.findIndex
funkcji, która przyjmuje funkcję jako argument:źródło
http://api.jquery.com/jQuery.unique/
możesz być także zainteresowany makeArray
Poprzedni przykład najlepiej powiedzieć, że sprawdź, czy istnieje przed wypchnięciem. Z perspektywy czasu widzę też, że możesz zadeklarować go jako część prototypu (tak się składa, że jest to również rozszerzenie klasy), więc poniżej nie ma dużego rozszerzenia.
Tyle że nie jestem pewien, czy indeksOf jest szybszą trasą niż InArray? prawdopodobnie.
źródło
Note that this only works on arrays of DOM elements, not strings or numbers.
Również indexOf nie działa w IE8 :(Z tych powodów używaj biblioteki js, takiej jak underscore.js . Użyj: union: Oblicza sumę przekazanych tablic: listę unikalnych elementów, w kolejności, które są obecne w jednej lub więcej tablicach.
źródło
Lubię to?
Z przedmiotem
źródło
array.find
to zły pomysł, ponieważ przeszukuje całą tablicę. UżyjfindIndex
, która wyszukuje tylko do pierwszego wystąpienia.Wiem, że to bardzo stare pytanie, ale jeśli używasz ES6, możesz użyć bardzo małej wersji:
Bardzo łatwo, najpierw dodaj filtr, który usuwa element - jeśli już istnieje, a następnie dodaj go przez konkat.
Oto bardziej realistyczny przykład:
Jeśli tablica zawiera obiekty, możesz dostosować funkcję filtrowania w następujący sposób:
źródło
Pchaj dynamicznie
W prosty sposób
Jeśli tablica zawiera tylko typy pierwotne / tablica prosta
źródło
Proponuję użyć zestawu ,
Zestawy dopuszczają tylko unikalne wpisy, co automatycznie rozwiązuje problem.
Zestawy można deklarować w następujący sposób:
źródło
Array.push
, więcSet.add
jest to odpowiednik tego.Łatwy kod, jeśli „indexOf” zwraca „-1”, oznacza to, że elementu nie ma w tablicy, wówczas warunek „=== -1” odzyskuje wartość prawda / fałsz.
Operator „&&” oznacza „i”, więc jeśli pierwszy warunek jest spełniony, wypychamy go do tablicy.
źródło
Nie jestem pewien prędkości, ale
stringification
+indexOf
to proste podejście. Zacznij od przekształcenia tablicy w ciąg:Następnie dla serii par atrybut-wartość możesz użyć:
Znalezienie całego obiektu jest prostsze:
źródło
Jeśli potrzebujesz czegoś prostego bez potrzeby rozszerzania prototypu Array:
źródło
W przypadku, gdy ktoś ma mniej skomplikowane wymagania, oto moja adaptacja odpowiedzi dla prostej tablicy ciągów:
Aktualizacja: Zamieniono indexOf i trim na alternatywy jQuery dla kompatybilności z IE8
źródło
Użyłem mapy i pomniejszenia, aby to zrobić w przypadku, gdy chcesz wyszukać według konkretnej właściwości obiektu, co jest przydatne, ponieważ wykonywanie bezpośredniej równości obiektów często kończy się niepowodzeniem.
źródło
Krótki przykład:
źródło
a to tablica obiektów, które masz
źródło
Możesz użyć metody findIndex z funkcją zwrotną i jej parametrem „this”.
Uwaga: stare przeglądarki nie znają funkcji findIndex, ale dostępny jest pakiet wypełniający.
Przykładowy kod (pamiętaj, że w pierwotnym pytaniu nowy obiekt jest wypychany tylko wtedy, gdy żaden z jego danych nie znajduje się w uprzednio popychanych obiektach):
źródło
Chyba spóźniłem się z odpowiedzią tutaj, ale w końcu wymyśliłem napisanego przez niego menedżera poczty. Działa to wszystko, czego potrzebuję.
źródło
Działa to func do porównywania obiektów. W niektórych przypadkach możesz mieć wiele pól do porównania. Wystarczy zapętlić tablicę i wywołać tę funkcję z istniejącymi elementami i nowym przedmiotem.
źródło
Tutaj możesz to zrobić w jednym wierszu dla dwóch tablic:
źródło
Możesz użyć jQuery grep i push, jeśli nie ma wyników: http://api.jquery.com/jQuery.grep/
Jest to w zasadzie to samo rozwiązanie, co w rozwiązaniu „przedłużanie prototypu”, ale bez przedłużania (lub zanieczyszczania) prototypu.
źródło
Możesz sprawdzić tablicę za pomocą foreach, a następnie pop element, jeśli istnieje, w przeciwnym razie dodaj nowy element ...
sample newItemValue i submFields to pary kluczy i wartości
źródło