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.

52voto

cantbebothered Punkte 543

Der Lodash-Weg https://lodash.com/docs#findKey

var users = {
  'barney':  { 'age': 36, 'active': true },
  'fred':    { 'age': 40, 'active': false },
  'pebbles': { 'age': 1,  'active': true }
};

_.findKey(users, { 'age': 1, 'active': true });
//  'pebbles'

1 Stimmen

Lodash ist eindeutig die beste Lösung für dieses Problem. Besser sogar, finde ich, als der Unterstrich Weg.

4 Stimmen

Zu Ihrer Information: "Die Unterstrichmethode": _.findKey(users, { 'age': 1, 'active': true }); ...ist es dasselbe

0 Stimmen

Wenn array der Wert ist, den Sie verwenden müssen:- let obj = { a: [1, 2], b: [3, 4], c: [5, 6] } _.findKey(obj, function(val) { return _.isEqual(val, [5, 6]); });

44voto

Pawel Punkte 12592
function extractKeyValue(obj, value) {
    return Object.keys(obj)[Object.values(obj).indexOf(value)];
}

Für Closure Compiler gemacht, um Schlüsselnamen zu extrahieren, die nach der Kompilierung unbekannt sind

Mehr sexy Version, aber mit Zukunft Object.entries Funktion

function objectKeyByValue (obj, val) {
  return Object.entries(obj).find(i => i[1] === val);
}

9 Stimmen

Ich denke, dies ist die beste Lösung für 2017+, da sie einfaches JavaScript verwendet.

0 Stimmen

Scheint nicht zu funktionieren, wenn Sie zwei oder mehr Zahlen mit demselben Wert haben

0 Stimmen

@SamuelChen das ist richtig, aber wenn es funktioniert, würde es bedeuten, dass ein Array als Ergebnis benötigt wird. Wo Object.entries(obj).find(i => i[1] === val); utilice filter stattdessen Object.entries(obj).filter(i => i[1] === val);

30voto

Benny Neugebauer Punkte 45468

Ich verwende diese Funktion:

Object.prototype.getKey = function(value){
  for(var key in this){
    if(this[key] == value){
      return key;
    }
  }
  return null;
};

Verwendung:

// ISO 639: 2-letter codes
var languageCodes = {
  DA: 'Danish',
  DE: 'German',
  DZ: 'Bhutani',
  EL: 'Greek',
  EN: 'English',
  EO: 'Esperanto',
  ES: 'Spanish'
};

var key = languageCodes.getKey('Greek');
console.log(key); // EL

10 Stimmen

+1 saubere Lösung. Aber ich habe eine Frage: Müsste man nicht immer prüfen, ob obj.hasOwnProperty(key) oder ist sie in diesem Fall unnötig?

6 Stimmen

Das Mutieren des Objektprototyps ist eine schlechte Praxis: stackoverflow.com/questions/23807805/

22voto

Systems Rebooter Punkte 1161

Nicht zitierfähige Lösung

Hauptfunktion:

var keyByValue = function(value) {

    var kArray = Object.keys(greetings);        // Creating array of keys
    var vArray = Object.values(greetings);      // Creating array of values
    var vIndex = vArray.indexOf(value);         // Finding value index 

    return kArray[vIndex];                      // Returning key by value index
}

Objekt mit Schlüsseln und Werten:

var greetings = {
    english   : "hello",
    ukranian  : ""
};

Test:

keyByValue("");
// => "ukranian"

3 Stimmen

Einfacher: Object.keys(greetings )[Object.values(greetings ).indexOf('')]

18voto

Kareem Punkte 4611

Behalten Sie Ihr Prototyp sauber.

function val2key(val,array){
    for (var key in array) {
        if(array[key] == val){
            return key;
        }
    }
 return false;
}

Ejemplo:

var map = {"first" : 1, "second" : 2};
var key = val2key(2,map); /*returns "second"*/

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