Mam dość prosty obiekt JavaScript, którego używam jako tablicy asocjacyjnej. Czy istnieje prosta funkcja pozwalająca mi uzyskać klucz do wartości, czy też muszę iterować obiekt i znaleźć go ręcznie?
javascript
object
arik
źródło
źródło
var o = []; var map = {first: o, second: o}
. Co byfind_key(o)
powrócił?Odpowiedzi:
Dzięki bibliotece Underscore.js :
źródło
_.chain(hash).pairs().findWhere({1: 1}).value()[0]
ES6, brak prototypowych mutacji lub bibliotek zewnętrznych.
Przykład,
źródło
keys()
materializuje zestaw kluczy.function getKeyByValue(object, value) { return Object.keys(object).filter(key => object[key] === value); }
Brak dostępnej standardowej metody. Musisz iterować i możesz stworzyć prostego pomocnika:
Jedno słowo ostrzeżenia : Nawet jeśli powyższe działa, generalnie złym pomysłem jest rozszerzenie dowolnego hosta lub obiektu natywnego
.prototype
. Zrobiłem to tutaj, ponieważ bardzo dobrze pasuje do problemu. W każdym razie powinieneś prawdopodobnie użyć tej funkcji poza.prototype
i przekazać do niej obiekt.źródło
.toString()
jakobj[ key ].toString()
i wartości w razie potrzeby ...Jak już wspomniano, potrzebna jest iteracja. Na przykład w nowoczesnej przeglądarce możesz mieć:
Gdzie
value
zawiera wartość, której szukasz. Powiedziałem, że prawdopodobnie użyłbym pętli.W przeciwnym razie możesz użyć odpowiedniego obiektu „hashmap” - istnieje kilka implementacji w JS - lub możesz to zrobić samodzielnie.
AKTUALIZACJA 2018
Minęło sześć lat, ale wciąż mam tu trochę głosów, więc mam wrażenie, że bardziej nowoczesne rozwiązanie - dla nowoczesnej przeglądarki / środowiska - powinno zostać wymienione w samej odpowiedzi, a nie tylko w komentarzach:
Oczywiście może to być także funkcja:
źródło
Object.keys(obj).or(o=>o[key] === value)
or
tablicy metoda i nie jest dla mnie jasne, jaki jest jej cel: docenię kilka dodatkowych szczegółów! :)or
pewno! Zostało to dopiero niedawno ocenione i zaakceptowane (nie sądzę, aby ktokolwiek jeszcze go wdrożył). To, co robi, to znalezienie pierwszego elementu tablicy pasującego do predykatu i zwrócenie go. Więc[1,2,3,4].or(x=>x>2)
wróci3
i[1,2,3,4,5].or(x=>x<3)
wróci1
. Coś w stylu FirstOrDefault C # :)or
metody? Z tego, co wspomniałeś, wydaje się, że zwraca element pasujący do predykatu „lub” samej tablicy?or
został przemianowany. Wierzę, że teraz powinieneś użyć find .Sposób na lodash https://lodash.com/docs#findKey
źródło
_.findKey(users, { 'age': 1, 'active': true });
... to to samo_.find_key({a: "A", b:"B"}, "B"})
zwraca,undefined
tak jak podano tutaj , musisz to zrobić_.find_key({a: "A", b:"B"}, _.partial(_.isEqual,"B")})
_.invert(haystack)[needle]
Stworzony dla kompilatora zamykającego w celu wyodrębnienia nazwy klucza, która po kompilacji będzie nieznana
Bardziej seksowna wersja, ale wykorzystująca
Object.entries
funkcję przyszłościźródło
Object.entries(obj).find(i => i[1] === val);
użyjfilter
Object.entries(obj).filter(i => i[1] === val);
ES6 + One Liners
Zwróć wszystkie klucze z wartością:
źródło
Korzystam z tej funkcji:
Stosowanie:
źródło
obj.hasOwnProperty(key)
czy w tym przypadku nie jest to konieczne?Główna funkcja:
Obiekt z kluczami i wartościami:
Test:
źródło
Object.keys(greetings )[Object.values(greetings ).indexOf('привіт')]
Przykład:
źródło
Jeśli pracujesz z biblioteką Underscore lub Lodash , możesz użyć funkcji _.findKey :
źródło
Stworzyłem bibliotekę bimap ( https://github.com/alethes/bimap ), która implementuje potężny, elastyczny i wydajny interfejs map dwukierunkowych JavaScript. Nie ma żadnych zależności i można go używać zarówno po stronie serwera (w Node.js można go zainstalować
npm install bimap
), jak iw przeglądarce (poprzez link do lib / bimap.js ).Podstawowe operacje są bardzo proste:
Pobieranie mapowania klucz-wartość jest równie szybkie w obu kierunkach. Pod maską nie ma kosztownych przejść między obiektami / tablicami, więc średni czas dostępu pozostaje stały, niezależnie od wielkości danych.
źródło
nie widział:
źródło
Ponieważ wartości są unikalne, powinno być możliwe dodanie wartości jako dodatkowego zestawu kluczy. Można to zrobić za pomocą następującego skrótu.
Umożliwiłoby to pobieranie za pomocą klucza lub wartości:
Zakłada się, że nie ma wspólnych elementów między kluczami a wartościami.
źródło
Biorąc pod uwagę
input={"a":"x", "b":"y", "c":"x"}
...output={"x":"a","y":"b"}
):output={"x":"c","y":"b"}
):output={"x":["c","a"],"y":["b"]}
):źródło
output['x']
. Czy o to pytałeś?http://jsfiddle.net/rTazZ/2/
źródło
Lub jeszcze łatwiej - utwórz nowy obiekt z kluczami i wartościami w żądanej kolejności, a następnie spójrz w górę na ten obiekt. Wystąpiły konflikty przy użyciu powyższych prototypowych kodów. Nie musisz używać funkcji String wokół klawisza, która jest opcjonalna.
źródło
To jest małe rozszerzenie metody Underscorejs i zamiast niej używa Lodash :
FindKey będzie wyszukiwać i powrócić pierwszy klucz , który odpowiada wartości.
Jeśli chcesz zamiast tego ostatniego dopasowania, użyj FindLastKey .
źródło
Jakby to pytanie nie zostało rozbite na miazgę ...
Oto jedna z ciekawości, jaką przyniesie ci ...
Jeśli masz pewność, że Twój obiekt będzie miał tylko wartości łańcuchowe, możesz naprawdę się wyczarować, aby wyczarować tę implementację:
Może jest tu coś użytecznego do zbudowania ...
Mam nadzieję, że to cię bawi.
źródło
Oto rozwiązanie Lodash, które działa dla płaskiego obiektu kluczowego =>, a nie dla obiektu zagnieżdżonego. Sugerowana do zaakceptowania propozycja odpowiedzi
_.findKey
działa z obiektami z obiektami zagnieżdżonymi, ale nie działa w tych powszechnych okolicznościach.Takie podejście odwraca obiekt, zamieniając klucze na wartości, a następnie znajduje klucz, wyszukując wartość nowego (odwróconego) obiektu. Jeśli klucz nie zostanie znaleziony, wówczas
false
jest zwracany, co wolę ponadundefined
, ale możesz łatwo zamienić go w trzecim parametrze_.get
metody wgetKey()
.źródło
Oto moje pierwsze rozwiązanie:
Na przykład przypuszczam, że mamy obiekt, który zawiera trzy pary wartości:
Możemy po prostu napisać findKey (tablica, wartość), który przyjmuje dwa parametry, które są obiektem i wartością szukanego klucza. Jako taka, ta metoda jest wielokrotnego użytku i nie trzeba ręcznie ręcznie iterować obiektu za każdym razem, przekazując tylko dwa parametry dla tej funkcji.
źródło
Metody ES6 :
źródło
Zazwyczaj zalecam lodash zamiast podkreślenia.
Jeśli go masz, użyj go.
Jeśli nie, powinieneś rozważyć użycie pakietu npm lodash.invert, który jest dość mały.
Oto jak możesz to przetestować za pomocą gulp:
1) Utwórz plik o nazwie gulpfile.js o następującej zawartości:
2) Zainstaluj pakiet lodash.invert i wypij
3) Sprawdź, czy to działa:
Bibliografia
https://www.npmjs.com/package/lodash.invert
https://lodash.com/
Różnice między lodash a podkreśleniem
https://github.com/gulpjs/gulp
źródło
Podkreśl rozwiązanie js
źródło
to działało dla mnie, aby uzyskać klucz / wartość obiektu.
źródło
Naprawdę proste.
źródło
Nie komplikuj!
Nie musisz filtrować obiektu za pomocą wyrafinowanych metod lub bibliotek, JavaScript ma wbudowaną funkcję o nazwie Object.values .
Przykład:
Spowoduje to zwrócenie danych właściwości obiektu.
Bibliografia
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values
źródło