Mam tablicę jak
vendors = [
{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} //and so on goes array...
];
Jak sprawdzić tę tablicę, aby sprawdzić, czy Magenic istnieje? Nie chcę zapętlać, chyba że muszę. Pracuję z potencjalnie kilkoma tysiącami płyt.
AKTUALIZACJA
Ponieważ jest to popularny post, pomyślałem, że podzielę się czymś nowym, co znalazłem. I wygląda na to, że @CAFxX już to udostępnił! Powinienem je częściej czytać. Natknąłem się na https://benfrain.com/understanding-native-javascript-array-methods/ .
vendors.filter(function(vendor){ return vendor.Name === "Magenic" })
A dzięki ECMAScript 2015 korzystanie z nowych funkcji strzałek jest jeszcze prostsze:
vendors.filter(vendor => vendor.Name === "Magenic")
javascript
arrays
David Lozzi
źródło
źródło
Odpowiedzi:
Edycja 2018 : Ta odpowiedź pochodzi z 2011 roku, zanim przeglądarki szeroko wspierały metody filtrowania tablic i funkcje strzałek. Spojrzeć na odpowiedź CAFxX użytkownika .
Nie ma „magicznego” sposobu sprawdzenia czegoś w tablicy bez pętli. Nawet jeśli użyjesz jakiejś funkcji, sama funkcja użyje pętli. To, co możesz zrobić, to wyjść z pętli, gdy tylko znajdziesz to, czego szukasz, aby zminimalizować czas obliczeniowy.
źródło
'Magenic'
jest gdzie indziej w obiekcieNie ma potrzeby wymyślania na nowo
kołozapętlić, przynajmniej nie jawnie (używając funkcji strzałek , tylko nowoczesne przeglądarki ):lub jeszcze lepiej :
EDYCJA: Jeśli potrzebujesz zgodności z kiepskimi przeglądarkami, najlepszym rozwiązaniem jest:
źródło
some
może spowodować zwarcie po znalezieniu obiektuname === "Magenic"
. Za pomocąfilter
sprawdzi każdy element do końca tablicy i utworzy nowe elementy tablicy spełniające warunek, a następnie sprawdzilength
Pętla nie jest wymagana. Trzy metody, które przychodzą na myśl:
Array.prototype.some ()
To jest najbardziej dokładna odpowiedź na twoje pytanie, tzn. „Sprawdź, czy coś istnieje”, co sugeruje wynik bool. Będzie to prawdą, jeśli będą jakieś „mageniczne” obiekty, w przeciwnym razie fałsz:
Array.prototype.filter ()
To zwróci tablicę wszystkich obiektów „Magenic”, nawet jeśli jest tylko jeden (zwróci tablicę jednoelementową):
Jeśli spróbujesz wymusić to na wartość logiczną, to nie zadziała, ponieważ pusta tablica (żadnych obiektów „magenicznych”) jest nadal prawdziwa. Więc po prostu użyj
magenicVendors.length
w swoim warunkowym.Array.prototype.find ()
Zwróci pierwszy obiekt „Magenic” (lub
undefined
jeśli go nie ma):Zmusza to do logicznej zgody (każdy obiekt jest prawdomówny,
undefined
jest fałszem).Uwaga: zamiast nazwy dostawcy używam dostawcy [„Nazwa”] ze względu na dziwną obudowę nazw właściwości.
Uwaga 2: Nie ma powodu, aby używać luźnej równości (==) zamiast ścisłej równości (===) podczas sprawdzania nazwy.
źródło
Akceptowana odpowiedź nadal działa, ale teraz mamy natywną metodę ECMAScript 6,
[Array.find][1]
aby osiągnąć ten sam efekt.Cytując MDN:
Zobacz mój związek jsfiddle Jest polyfill dla IE dostarczane przez Mozillę
źródło
return ele.id == '2'
, ale +1 za dobre rozwiązanie ES6.push if <0 || splice(index, 1)
oto mój nieco zaktualizowany kod:const index = this.selected.indexOf(this.selected.find(s => s.id == passedObj.id))
Oto jak bym to zrobił
array.some()
Metoda sprawdza, czy w tablicy jest co najmniej jedna wartość zgodna z kryteriami i zwraca wartość logiczną. Odtąd możesz iść z:źródło
Chyba że chcesz go zrestrukturyzować w ten sposób:
do czego możesz zrobić
if(vendors.Magnetic)
Będziesz musiał zapętlić
źródło
Zgodnie ze specyfikacją ECMAScript 6 można użyć
findIndex
.const magenicIndex = vendors.findIndex(vendor => vendor.Name === 'Magenic');
magenicIndex
będzie przechowywać albo0
(który jest indeksem w tablicy), albo-1
jeśli nie został znaleziony.źródło
Jak OP zadał pytanie, czy klucz istnieje, czy nie .
Bardziej eleganckie rozwiązanie, które zwróci wartość logiczną za pomocą funkcji redukcji ES6
Uwaga: Początkowy parametr redukcji to a,
false
a jeśli tablica ma klucz, zwróci wartość true.Mam nadzieję, że pomoże to w lepszym i czystszym wdrażaniu kodu
źródło
reduce
jest akumulator, a nievendor
obiekt. Sprawdza sięfalse.Name === "Magenic"
w każdej pętli i zwraca falseNie da się tak naprawdę nie spojrzeć na przedmiot.
Prawdopodobnie powinieneś trochę zmienić swoją strukturę
Następnie możesz po prostu użyć go jako skrótu wyszukiwania.
źródło
Może być za późno, ale tablica javascript ma dwie metody
some
ievery
metodę, która zwraca wartość logiczną i może ci w tym pomóc.Myślę, że
some
byłoby najbardziej odpowiednie dla tego, co zamierzasz osiągnąć.Niektóre potwierdzają, że dowolny obiekt w tablicy spełnia podany warunek.
Każdy potwierdza, że wszystkie obiekty w tablicy spełniają dany warunek.
źródło
const array1 = [{name:'Mike'},{name:'Alice'}]; console.log(array1.every(item => item.name !== 'Mike'));
, powinno zwrócić wartość truesome
, zaktualizuje moją odpowiedź.Musisz zapętlić, nie da się tego obejść.
Oczywiście możesz użyć biblioteki takiej jak linq.js, aby uczynić to bardziej przyjemnym:
(widzieć demo jsFiddle )
Wątpię, aby linq.js był szybszy niż prosta pętla, ale z pewnością jest bardziej elastyczny, gdy sprawy stają się trochę bardziej skomplikowane.
źródło
Testowanie elementów tablicy:
JS Oferuje funkcje tablicowe, które pozwalają stosunkowo łatwo to osiągnąć. Są to:
Array.prototype.filter
: Pobiera funkcję wywołania zwrotnego, która jest testem, a następnie tablica jest iterowana za pomocą wywołania zwrotnego i filtrowana zgodnie z tym wywołaniem zwrotnym. Zwracana jest nowa filtrowana tablica.Array.prototype.some
: Pobiera funkcję wywołania zwrotnego, która jest testem, następnie tablica jest iterowana za pomocą wywołania zwrotnego, a jeśli jakikolwiek element przejdzie test, zwracana jest wartość logiczna true. W przeciwnym razie zwracana jest wartość falseSzczegóły najlepiej wyjaśnić na przykładzie:
Przykład:
Obsługa przeglądarki:
Te 2 funkcje są
ES6
funkcyjne, nie wszystkie przeglądarki mogą je obsługiwać. Aby temu zaradzić, możesz użyć polypełniacza. Oto wypełnienie dlaArray.prototype.some
(z MDN):źródło
jeśli używasz jquery, możesz skorzystać z grep, aby utworzyć tablicę ze wszystkimi pasującymi obiektami:
a następnie użyj tablicy wyników:
źródło
Popraw mnie, jeśli się mylę. Mogłem użyć
forEach
takiej metody,Obecnie jestem do tego przyzwyczajony, ze względu na prostotę i zrozumiałe słowo. Dziękuję Ci.
źródło
Możesz spróbować tego dla mnie.
źródło
Możesz użyć lodash . Jeśli biblioteka Lodash jest zbyt ciężka dla twojej aplikacji, rozważ wycinanie niepotrzebnej funkcji, która nie jest używana.
To tylko jeden ze sposobów, aby to zrobić. Innym może być:
console.log(arr);
Powyższy przykład można również przepisać bez użycia bibliotek takich jak:
Mam nadzieję, że moja odpowiedź pomaga.
źródło
Wiele odpowiedzi tutaj jest dobrych i dość łatwych. Ale jeśli twoja tablica obiektów ma ustalony zestaw wartości, możesz użyć poniższej sztuczki:
Zamapuj całą nazwę w obiekcie.
Teraz ten brudnyObj możesz używać wielokrotnie bez pętli.
źródło
Aby porównać jeden obiekt z drugim, łączę pętlę for in (używaną do przechodzenia między obiektami) i niektóre (). Nie musisz się martwić, że tablica wykracza poza granice itp., Więc oszczędza trochę kodu. Dokumentację na temat .some można znaleźć tutaj
Alternatywnym sposobem porównywania jednego obiektu z drugim jest użycie zagnieżdżonej pętli for z Object.keys (). Length, aby uzyskać liczbę obiektów w tablicy. Kod poniżej:
Aby odpowiedzieć na dokładne pytanie, jeśli po prostu szukasz wartości w obiekcie, możesz użyć pojedynczej pętli for in.
źródło
Alternatywnie możesz zrobić:
źródło
var without2 = (arr, args) => arr.filter(v => v.id !== args.id);
Przykład:without2([{id:1},{id:1},{id:2}],{id:2})
Wynik: bez2 ([{id: 1}, {id: 1}, {id: 2}], {id: 2})
źródło
źródło
Moje podejście do rozwiązania tego problemu polega na użyciu ES6 i stworzeniu funkcji, która sprawdza nas. Zaletą tej funkcji jest to, że można ją ponownie wykorzystać w całym projekcie, aby sprawdzić dowolną tablicę obiektów podanych jako
key
ivalue
do sprawdzenia.DOSKONAŁA ROZMOWA, ZOBACZmy KOD
Szyk
Funkcjonować
Zadzwoń / skorzystaj
źródło
Wolę iść z regex.
Jeśli Twój kod jest następujący,
Chciałbym polecić
źródło