Ich habe ein recht einfaches JavaScript-Objekt, das ich als assoziatives Array verwende. Gibt es eine einfache Funktion, mit der ich den Schlüssel für einen Wert abrufen kann, oder muss ich das Objekt iterieren und manuell herausfinden?
javascript
object
arik
quelle
quelle
var o = []; var map = {first: o, second: o}
. Was würdefind_key(o)
zurückkehren?Antworten:
Mit der Bibliothek Underscore.js :
quelle
_.chain(hash).pairs().findWhere({1: 1}).value()[0]
ES6, keine Prototypmutationen oder externe Bibliotheken.
Beispiel,
quelle
keys()
der Schlüsselsatz materialisiert wird.function getKeyByValue(object, value) { return Object.keys(object).filter(key => object[key] === value); }
Keine Standardmethode verfügbar. Sie müssen iterieren und können einen einfachen Helfer erstellen:
Ein Wort der Vorsicht : Auch wenn das oben genannte funktioniert, ist es im Allgemeinen eine schlechte Idee, Hosts oder native Objekte zu erweitern
.prototype
. Ich habe es hier gemacht, weil es sehr gut zum Thema passt. Auf jeden Fall sollten Sie diese Funktion wahrscheinlich außerhalb von verwenden.prototype
und stattdessen das Objekt übergeben.quelle
.toString()
wieobj[ key ].toString()
und zum Wert hinzu, wenn gewünscht ...Wie gesagt, ist eine Iteration erforderlich. In einem modernen Browser könnten Sie beispielsweise Folgendes haben:
Wo
value
enthält der Wert, den Sie suchen. Sagte, ich würde wahrscheinlich eine Schleife verwenden.Andernfalls könnten Sie ein geeignetes "Hashmap" -Objekt verwenden - es gibt mehrere Implementierungen in JS - oder es selbst implementieren.
UPDATE 2018
Sechs Jahre sind vergangen, aber ich bekomme hier immer noch einige Stimmen, daher denke ich, dass eine modernere Lösung - für moderne Browser / Umgebungen - in der Antwort selbst und nicht nur in den Kommentaren erwähnt werden sollte:
Natürlich kann es auch eine Funktion sein:
quelle
Object.keys(obj).or(o=>o[key] === value)
or
Arrays bekannt Methode, und es ist mir nicht klar, seinen Zweck hier: Ich werde einige zusätzliche Details schätzen! :)or
sicher! Es wurde erst kürzlich evaluiert und akzeptiert (ich glaube, noch implementiert es niemand). Es findet das erste Element eines Arrays, das mit einem Prädikat übereinstimmt, und gibt es zurück. Also[1,2,3,4].or(x=>x>2)
würde zurückkehren3
und[1,2,3,4,5].or(x=>x<3)
würde zurückkehren1
. So etwas wie C # 's FirstOrDefault :)or
Methode? Nach dem, was Sie erwähnt haben, scheint es das Element zurückzugeben, das dem Prädikat "oder" dem Array selbst entspricht?or
wurde umbenannt. Ich glaube jetzt solltest du find verwenden .Der lodash Weg https://lodash.com/docs#findKey
quelle
_.findKey(users, { 'age': 1, 'active': true });
_.find_key({a: "A", b:"B"}, "B"})
kehrt zurückundefined
, wie hier angegeben , müssen Sie tun_.find_key({a: "A", b:"B"}, _.partial(_.isEqual,"B")})
_.invert(haystack)[needle]
Für den Closure-Compiler gemacht, um Schlüsselnamen zu extrahieren, die nach der Kompilierung unbekannt sind
Sexy Version, aber mit zukünftiger
Object.entries
Funktionquelle
Object.entries(obj).find(i => i[1] === val);
Nutzungfilter
stattObject.entries(obj).filter(i => i[1] === val);
Object.entries(obj).find( ([ key, value ]) => value === val);
ES6 + One Liner
Geben Sie alle Schlüssel mit dem Wert zurück:
quelle
Ich benutze diese Funktion:
Verwendungszweck:
quelle
obj.hasOwnProperty(key)
oder ist es in diesem Fall unnötig?Hauptfunktion:
Objekt mit Schlüsseln und Werten:
Prüfung:
quelle
Object.keys(greetings )[Object.values(greetings ).indexOf('привіт')]
Beispiel:
quelle
Wenn Sie mit einer Underscore- oder Lodash- Bibliothek arbeiten, können Sie die Funktion _.findKey verwenden:
quelle
Ich habe die Bimap- Bibliothek ( https://github.com/alethes/bimap ) erstellt, die eine leistungsstarke, flexible und effiziente bidirektionale JavaScript-Kartenschnittstelle implementiert. Es hat keine Abhängigkeiten und kann sowohl auf der Serverseite (in Node.js können Sie es installieren
npm install bimap
) als auch im Browser (durch Verknüpfen mit lib / bimap.js ) verwendet werden.Grundlegende Operationen sind wirklich einfach:
Das Abrufen der Schlüsselwertzuordnung erfolgt in beide Richtungen gleich schnell. Unter der Haube befinden sich keine kostspieligen Objekt- / Array-Durchquerungen, sodass die durchschnittliche Zugriffszeit unabhängig von der Größe der Daten konstant bleibt.
quelle
habe folgendes nicht gesehen:
quelle
Da die Werte eindeutig sind, sollte es möglich sein, die Werte als zusätzlichen Schlüsselsatz hinzuzufügen. Dies könnte mit der folgenden Verknüpfung erfolgen.
Dies würde das Abrufen entweder über den Schlüssel oder den Wert ermöglichen:
Dies setzt voraus, dass es keine gemeinsamen Elemente zwischen den Schlüsseln und Werten gibt.
quelle
Gegeben
input={"a":"x", "b":"y", "c":"x"}
...output={"x":"a","y":"b"}
):output={"x":"c","y":"b"}
):output={"x":["c","a"],"y":["b"]}
):quelle
output['x']
. Haben Sie das gefragt?http://jsfiddle.net/rTazZ/2/
quelle
Oder noch einfacher: Erstellen Sie ein neues Objekt mit den Schlüsseln und Werten in der gewünschten Reihenfolge und suchen Sie dann nach diesem Objekt. Wir hatten Konflikte mit den oben genannten Prototypcodes. Sie müssen die String-Funktion nicht um den Schlüssel herum verwenden, das ist optional.
quelle
Dies ist eine kleine Erweiterung der Underscorejs-Methode und verwendet stattdessen Lodash :
FindKey wird die erste Taste suchen und zurückgeben , die den Wert übereinstimmt.
Wenn Sie stattdessen die letzte Übereinstimmung wünschen, verwenden Sie stattdessen FindLastKey .
quelle
Als ob diese Frage nicht zu Brei geschlagen worden wäre ...
Hier ist eine, nur für die Neugier, die sie Ihnen bringt ...
Wenn Sie sicher sind, dass Ihr Objekt nur Zeichenfolgenwerte enthält, können Sie sich wirklich erschöpfen, um diese Implementierung zu erstellen:
Vielleicht gibt es hier etwas Nützliches zu bauen ...
Hoffe das amüsiert dich.
quelle
Hier ist eine Lodash-Lösung dafür, die für ein Objekt mit flachem Schlüssel => Wert und nicht für ein verschachteltes Objekt funktioniert. Der Vorschlag der akzeptierten Antwort zur Verwendung
_.findKey
funktioniert für Objekte mit verschachtelten Objekten, funktioniert jedoch unter diesen allgemeinen Umständen nicht.Dieser Ansatz invertiert das Objekt, tauscht Schlüssel gegen Werte aus und findet den Schlüssel dann, indem er den Wert des neuen (invertierten) Objekts nachschlägt. Wenn der Schlüssel nicht gefunden wird,
false
wird er zurückgegeben, was ich vorzieheundefined
, aber Sie können dies leicht im dritten Parameter der_.get
Methode in austauschengetKey()
.quelle
Hier ist zuerst meine Lösung:
Zum Beispiel nehme ich an, dass wir ein Objekt haben, das drei Wertepaare enthält:
Wir können einfach einen findKey (Array, Wert) schreiben, der zwei Parameter akzeptiert, die ein Objekt und den Wert des gesuchten Schlüssels sind. Daher ist diese Methode wiederverwendbar und Sie müssen das Objekt nicht jedes Mal manuell iterieren, indem Sie nur zwei Parameter für diese Funktion übergeben.
quelle
ES6- Methoden:
quelle
Ich empfehle eher lodash als Unterstrich.
Wenn Sie es haben, verwenden Sie es.
Wenn Sie dies nicht tun, sollten Sie in Betracht ziehen, das Paket lodash.invert npm zu verwenden, das ziemlich klein ist.
So können Sie es mit gulp testen:
1) Erstellen Sie eine Datei namens gulpfile.js mit folgendem Inhalt:
2) Installieren Sie das lodash.invert-Paket und schlucken Sie
3) Testen Sie, ob es funktioniert:
Verweise
https://www.npmjs.com/package/lodash.invert
https://lodash.com/
Unterschiede zwischen lodash und Unterstrich
https://github.com/gulpjs/gulp
quelle
Unterstreichen Sie js Lösung
quelle
Dies funktionierte für mich, um den Schlüssel / Wert des Objekts zu erhalten.
quelle
Wirklich unkompliziert.
quelle
Halte es einfach!
Sie müssen das Objekt nicht durch ausgefeilte Methoden oder Bibliotheken filtern. Javascript verfügt über eine integrierte Funktion namens Object.values . .
Beispiel:
Dadurch werden die Objekteigenschaftsdaten zurückgegeben.
Verweise
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values
quelle