Mam na przykład:
var Data = [
{ id_list: 1, name: 'Nick', token: '312312' },
{ id_list: 2, name: 'John', token: '123123' },
]
Następnie chcę na przykład posortować / odwrócić ten obiekt name
. A potem chcę uzyskać coś takiego:
var Data = [
{ id_list: 2, name: 'John', token: '123123' },
{ id_list: 1, name: 'Nick', token: '312312' },
]
A teraz chcę poznać indeks obiektu z właściwością, name='John'
aby uzyskać wartość tokena właściwości.
Jak rozwiązać problem?
javascript
arrays
object
rsboarder
źródło
źródło
{Key:Value}
, naprawiłem to dla ciebie.Data
obiekt natywny . Jest to jedynie nazwa dużej litery, co jest sprzeczne z konwencją. Jeśli komuś to przeszkadza, dokonam edycji pytania i odpowiedzi, aby naprawić to nazewnictwo.Odpowiedzi:
Jak sugerują inne odpowiedzi, zapętlanie tablicy jest prawdopodobnie najlepszym sposobem. Ale ustawiłbym to na swoją funkcję i uczyniłbym to trochę bardziej abstrakcyjnym:
Dzięki temu nie tylko możesz znaleźć, który zawiera „John”, ale możesz również znaleźć, który zawiera token „312312”:
EDYCJA: Zaktualizowano funkcję, aby zwracała -1, gdy nie została znaleziona, dzięki czemu działa zgodnie z tą samą konstrukcją, co Array.prototype.indexOf ()
źródło
Ponieważ część sortowania jest już odebrana. Mam zamiar zaproponować inny elegancki sposób uzyskania indeksu właściwości w tablicy
Twój przykład to:
Możesz to zrobić:
Array.prototype.map
nie jest dostępny w IE7 lub IE8. Kompatybilność z ES5A oto z ES6 i składnią strzałek, która jest jeszcze prostsza:
źródło
Jeśli nie masz nic przeciwko korzystaniu z ES6. Tablice mają teraz funkcję findIndex . Co oznacza, że możesz zrobić coś takiego:
źródło
name: John
), to zwróci tylko pierwszy meczKtóra jest uproszczoną wersją:
Z mozilla.org:
źródło
token
pole zamiastname
pola, mogą występować problemy, jakData[0].token == 312312
oceniatrue
, aleData[0].token === 321321
oceniafalse
.Jeśli masz problemy z IE, możesz użyć funkcji map (), która jest obsługiwana od wersji 9.0:
źródło
Jedynym znanym mi sposobem jest zapętlanie całej tablicy:
lub bez rozróżniania wielkości liter:
W wyniku zmienny indeks zawiera indeks obiektu lub -1, jeśli nie został znaleziony.
źródło
prototypowy sposób
źródło
Możesz użyć Array.sort za pomocą funkcji niestandardowej jako parametru do zdefiniowania mechanizmu sortowania.
W twoim przykładzie dałoby to:
Funkcja sortowania musi zwrócić albo -1, jeśli a powinno wystąpić przed b, 1, jeśli a powinno nastąpić po b, i 0, jeśli oba są równe. Do Ciebie należy określenie właściwej logiki w funkcji sortowania, aby posortować tablicę.
Edycja: pominięto ostatnią część pytania, w której chcesz poznać indeks. Trzeba będzie zapętlić tablicę, aby znaleźć to, jak powiedzieli inni.
źródło
Wystarczy przejrzeć tablicę i znaleźć pozycję:
źródło
if(Data[item].name == 'John')
, naprawiłem to dla ciebie.To może być przydatne
Skopiowałem to z https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects
źródło
Dlaczego nie używasz małego obejścia?
Utwórz nową tablicę z nazwami jako indeksami. potem wszystkie wyszukiwania będą używać indeksów. Tak więc tylko jedna pętla. Po tym nie musisz zapętlać wszystkich elementów!
http://jsbin.com/xibala/1/edit
przykład na żywo.
źródło
Rozszerzona odpowiedź Chrisa Picketta, ponieważ w moim przypadku musiałem szukać głębiej niż jeden poziom atrybutu:
Możesz przekazać „attr1.attr2” do funkcji
źródło
A co z tym ? :
Zakładając, że używasz lodash lub underscorejs.
źródło
Jeśli masz jeden obiekt z wieloma obiektami w środku, jeśli chcesz wiedzieć, czy jakiś obiekt znajduje się w obiekcie głównym, po prostu wstaw find (MasterObject, 'Object to Search'), ta funkcja zwróci odpowiedź, jeśli istnieje lub nie (PRAWDA lub FAŁSZ ), Mam nadzieję, że pomogę w tym, mogę zobaczyć przykład na JSFiddle .
źródło
źródło
źródło
Jeśli chcesz uzyskać wartość tokena właściwości, możesz także spróbować tego
gdzie _.findKey jest funkcją loży
źródło
Alternatywnie do odpowiedzi niemieckiego Attanasio Ruiza możesz wyeliminować drugą pętlę, używając Array.reduce () zamiast Array.map ();
źródło
Za pomocą podkreślenia:
źródło