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.

17voto

craigmichaelmartin Punkte 5663

Wenn Sie arbeiten mit Unterstrich o Lodash Bibliothek, können Sie die _.findKey Funktion:

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

_.findKey(users, function(o) { return o.age < 40; });
// => 'barney' (iteration order is not guaranteed)

// The `_.matches` iteratee shorthand.
_.findKey(users, { 'age': 1, 'active': true });
// => 'pebbles'

// The `_.matchesProperty` iteratee shorthand.
_.findKey(users, ['active', false]);
// => 'fred'

// The `_.property` iteratee shorthand.
_.findKey(users, 'active');
// => 'barney'

16voto

Alethes Punkte 912

Ich habe die bimap Bibliothek ( https://github.com/alethes/bimap ), die eine leistungsstarke, flexible und effiziente bidirektionale JavaScript-Schnittstelle für Karten implementiert. Es hat keine Abhängigkeiten und kann sowohl auf der Server-Seite (in Node.js können Sie es mit npm install bimap ) und im Browser (durch Verlinkung mit lib/bimap.js ).

Die Grundfunktionen sind wirklich einfach:

var bimap = new BiMap;
bimap.push("k", "v");
bimap.key("k") // => "v"
bimap.val("v") // => "k"

bimap.push("UK", ["London", "Manchester"]);
bimap.key("UK"); // => ["London", "Manchester"]
bimap.val("London"); // => "UK"
bimap.val("Manchester"); // => "UK"

Der Abruf der Schlüssel-Wert-Zuordnung ist in beide Richtungen gleich schnell. Es gibt keine kostspieligen Objekt-/Array-Traversals unter der Haube, so dass die durchschnittliche Zugriffszeit unabhängig von der Größe der Daten konstant bleibt.

0 Stimmen

Eine der einzigen Lösungen, die keine Iteration erfordert (entweder in der Lösung selbst, der Standardbibliothek oder einer anderen Bibliothek).

14voto

Sahil Ralkar Punkte 1950

Dies funktionierte für mich, um Schlüssel/Wert des Objekts zu erhalten.

let obj = {
        'key1': 'value1',
        'key2': 'value2',
        'key3': 'value3',
        'key4': 'value4'
    }
    Object.keys(obj).map(function(k){ 
    console.log("key with value: "+k +" = "+obj[k])    

    })

0 Stimmen

Das ist aber keine Antwort auf die Frage, und zwar ganz allgemein, map sollte nur verwendet werden, wenn Sie den Rückgabewert benötigen - nicht als allgemeiner Iterator

8voto

Den Kerny Punkte 483

Hat folgendes nicht gesehen:

const obj = {
  id: 1,
  name: 'Den'
};

function getKeyByValue(obj, value) {
  return Object.entries(obj).find(([, name]) => value === name);
}

const [ key ] = getKeyByValue(obj, 'Den');
console.log(key)

5voto

Noel Abrahams Punkte 7413

Da die Werte eindeutig sind, sollte es möglich sein, die Werte als zusätzlichen Satz von Schlüsseln hinzuzufügen. Dies könnte mit der folgenden Abkürzung geschehen.

var foo = {};
foo[foo.apple = "an apple"] = "apple";
foo[foo.pear = "a pear"] = "pear";

Dies würde einen Abruf entweder über den Schlüssel oder den Wert ermöglichen:

var key = "apple";
var value = "an apple";

console.log(foo[value]); // "apple"
console.log(foo[key]); // "an apple"

Dabei wird davon ausgegangen, dass es keine gemeinsamen Elemente zwischen den Schlüsseln und Werten gibt.

1 Stimmen

Eine der einzigen Lösungen, die keine Iteration erfordert (entweder in der Lösung selbst, der Standardbibliothek oder einer anderen Bibliothek).

1 Stimmen

Der Auftraggeber sagte, dass alle Schlüssel/Wert-Paare eindeutig sind, daher ist diese Low-Tech-Antwort einfach fantastisch! Gut gemacht ;)

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