722 Stimmen

Wie erhält man einen Schlüssel in einem JavaScript-Objekt durch seinen Wert?

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 es manuell herausfinden?

0 Stimmen

Es gibt keine Standardfunktion für diese Aufgabe. Wenn die Zuordnung wirklich bidirektional ist, ist es trivial, eine "umgekehrte" Zuordnung zu konstruieren und diese zu indizieren. Andernfalls eine einfache Eigenschaft-Iterator (mit einem hasOwnProperty gaurd, vielleicht) und eine frühe Rückgabe versteckt innerhalb einer Funktion tut gerade schön...

0 Stimmen

Wie könnte das funktionieren, wenn ein Objekt von mehr als einem Schlüssel referenziert wird? var o = []; var map = {first: o, second: o} . Was würde find_key(o) zurückkehren?

5 Stimmen

Spielt keine Rolle ;) Ich wollte es nur für ein Array mit eindeutigen Schlüssel-Wert-Paaren verwenden.

1137voto

UncleLaz Punkte 11103
function getKeyByValue(object, value) {
  return Object.keys(object).find(key => object[key] === value);
}

ES6, keine Prototyp-Mutationen oder externe Bibliotheken.

Beispiel,

function getKeyByValue(object, value) {
  return Object.keys(object).find(key => object[key] === value);
}

const map = {"first" : "1", "second" : "2"};
console.log(getKeyByValue(map,"2"));

12 Stimmen

Nun, wirklich sauber, wenn Sie den IE11 nicht unterstützen :-)Wenn ja, brauchen Sie ein Polyfill

4 Stimmen

Je nach Implementierung dauert dies wahrscheinlich O(n) Raum seit keys() materialisiert den Schlüsselsatz.

2 Stimmen

Sauber, aber langsam.

192voto

jAndy Punkte 223172

Keine Standardmethode verfügbar. Sie müssen iterieren und können ein einfaches Hilfsmittel erstellen:

Object.prototype.getKeyByValue = function( value ) {
    for( var prop in this ) {
        if( this.hasOwnProperty( prop ) ) {
             if( this[ prop ] === value )
                 return prop;
        }
    }
}

var test = {
   key1: 42,
   key2: 'foo'
};

test.getKeyByValue( 42 );  // returns 'key1'

Ein Wort der Warnung : Auch wenn die obige Methode funktioniert, ist es im Allgemeinen eine schlechte Idee, ein Host- oder natives Objekt zu erweitern. .prototype . Ich habe es hier gemacht, weil es sehr gut zum Thema passt. Wie auch immer, Sie sollten diese Funktion wahrscheinlich außerhalb der .prototype und übergeben Sie das Objekt stattdessen an diese.

2 Stimmen

Eigentlich ist es in Ordnung, wenn Sie wissen, dass die for-in-Schleife die Eigenschaftskette abwärts geht, was bedeutet, dass "for(var key in obj)" Ihnen "getKeyByValue" als "key" an einem bestimmten Punkt geben würde.

0 Stimmen

Oh Mann, ich liebe es, wie dies heimlich zurückgibt undefiniert, wenn der Wert nicht vorhanden ist. Gut gemacht. Auch, nur ein Punkt des Interesses, würde dies O(n) durchführen, so dass, wenn das Objekt eine Tonne von Eigenschaften (wie eine Liste von Menschen in einer großen Stadt und ihre Adressen) hatte, würden Sie wahrscheinlich wollen eine effizientere Suche. Vielleicht Werte sortieren und binäre Suche? Oder?

0 Stimmen

Vielen Dank, durch die Zeit sah ich schlechte Idee, ich frage mich, warum dann suchte ich durch diese und fügte hinzu, hier für diese Antwort Verbesserung und umfangreiche Lesung. stackoverflow.com/questions/3085240/

171voto

ZER0 Punkte 23469

Wie gesagt, es bedarf der Iteration. Zum Beispiel, in modernen Browser könnte man haben:

var key = Object.keys(obj).filter(function(key) {return obj[key] === value})[0];

Wo value enthält den gesuchten Wert. Gesagt, dass, würde ich wahrscheinlich eine Schleife verwenden.

Andernfalls könnten Sie ein richtiges "hashmap"-Objekt verwenden - es gibt mehrere Implementierungen in JS herum - oder implementieren Sie durch Ihre eigenen.

UPDATE 2018

Sechs Jahre sind vergangen, aber ich bekomme immer noch einige Stimmen hier, also 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:

const key = Object.keys(obj).find(key => obj[key] === value);

Natürlich kann es auch eine Funktion sein:

const getKeyByValue = (obj, value) => 
        Object.keys(obj).find(key => obj[key] === value);

22 Stimmen

ES6: Object.keys(obj).or(o=>o[key] === value)

0 Stimmen

Leider gibt es die Pfeilfunktion noch in keinem "modernen" Browser, so dass sie im Moment etwas nutzlos ist - ich benutze sie in jetpack auf Firefox Nightly, sie wird in Firefox 22 sein. Wie auch immer, ich bin mir nicht bewusst über jede or Array-Methode, und es ist mir nicht klar, welchen Zweck sie hier verfolgt: Ich würde einige zusätzliche Details zu schätzen wissen! :)

1 Stimmen

Was den Pfeil angeht, so kommt er und ich warte darauf :) Wie für or Sicher! Es wurde erst kürzlich evaluiert und akzeptiert (ich glaube nicht, dass es schon jemand implementiert hat). Es findet das erste Element eines Arrays, das einem Prädikat entspricht, und gibt es zurück. Also [1,2,3,4].or(x=>x>2) würde zurückkehren 3 et [1,2,3,4,5].or(x=>x<3) würde zurückkehren 1 . So etwas wie C#s FirstOrDefault :)

104voto

chickens Punkte 14182

Kürzeste Einzeiler

let key = Object.keys(obj).find(k=>obj[k]===value);

Gibt alle Schlüssel mit dem Wert zurück:

let keys = Object.keys(obj).filter(k=>obj[k]===value);

Wenn der Wert ein Array o Object :

let keys = Object.keys(obj).filter(k=>JSON.stringify(obj[k])===JSON.stringify(value));

93voto

banyan Punkte 3298

Mit dem Underscore.js Bibliothek:

var hash = {
  foo: 1,
  bar: 2
};

(_.invert(hash))[1]; // => 'foo'

443 Stimmen

@GeorgeJempty Nicht jeder möchte eine 5kb große Bibliothek für eine einfache Schlüsselabfrage laden ;)

5 Stimmen

Nur zur Information für alle, die nach einer Lösung suchen, die Ihnen ALLE Schlüssel liefert, die mit einem Wert übereinstimmen: Das wird nicht funktionieren.

2 Stimmen

Unterstrich-Tasten funktionieren auch. underscorejs.org/#Schlüssel _.keys({one: 1, two: 2, three: 3}); => ["one", "two", "three"]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X