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.

5voto

Fabio Beltramini Punkte 2251

Gegeben input={"a":"x", "b":"y", "c":"x"} ...

  • So verwenden Sie den ersten Wert (z.B.. output={"x":"a","y":"b"} ):

    input = { "a": "x", "b": "y", "c": "x" } output = Object.keys(input).reduceRight(function(accum, key, i) { accum[input[key]] = key; return accum; }, {}) console.log(output)

  • So verwenden Sie den letzten Wert (z.B.. output={"x":"c","y":"b"} ):

    input = { "a": "x", "b": "y", "c": "x" } output = Object.keys(input).reduce(function(accum, key, i) { accum[input[key]] = key; return accum; }, {}) console.log(output)

  • Um ein Array von Schlüsseln für jeden Wert zu erhalten (z.B.. output={"x":["c","a"],"y":["b"]} ):

    input = { "a": "x", "b": "y", "c": "x" } output = Object.keys(input).reduceRight(function(accum, key, i) { accum[input[key]] = (accum[input[key]] || []).concat(key); return accum; }, {}) console.log(output)

1 Stimmen

Dies ist definitiv die beste Antwort, aber ich kratzte meinen Kopf über einen Weg, um es umzuwandeln, um nur den Schlüssel für ein bestimmtes Objekt zurückzugeben, d.h. funktional äquivalent zu indexOf für ein Array sein.

0 Stimmen

Wenn der Speicherplatz nicht begrenzt ist und Sie bereit sind, viel Rechenleistung aufzuwenden, um das Objekt viele Male zu durchsuchen, speichern Sie die "Ausgabe" wie oben angegeben in einer Variablen und suchen Sie das Ergebnis darin... wie output['x'] . Ist es das, was du wissen wolltest?

4voto

kumarharsh Punkte 17926

Dies ist eine kleine Erweiterung der Underscorejs-Methode und verwendet Lodash stattdessen:

var getKeyByValue = function(searchValue) {
  return _.findKey(hash, function(hashValue) {
    return searchValue === hashValue;
  });
}

FindKey wird suchen und den ersten Schlüssel zurückgeben die mit dem Wert übereinstimmt.
Wenn Sie stattdessen die letzte Übereinstimmung wünschen, verwenden Sie FindLastKey stattdessen.

4voto

atl3 Punkte 107

ES6 Methoden:

Object.fromEntries(Object.entries(a).map(b => b.reverse()))['value_you_look_for']

3voto

Kevin Leary Punkte 7707

Hier ist eine Lodash-Lösung für dieses Problem, die für flache Schlüssel => Wert-Objekt, anstatt ein verschachteltes Objekt funktioniert. Der in der akzeptierten Antwort enthaltene Vorschlag zur Verwendung von _.findKey funktioniert bei Objekten mit verschachtelten Objekten, aber nicht in diesem häufigen Fall.

Bei diesem Ansatz wird das Objekt invertiert, wobei die Schlüssel mit den Werten vertauscht werden, und dann wird der Schlüssel durch Nachschlagen des Wertes im neuen (invertierten) Objekt gefunden. Wenn der Schlüssel nicht gefunden wird, dann false zurückgegeben wird, was ich gegenüber undefined aber Sie könnten dies einfach durch den dritten Parameter der Methode _.get Methode in getKey() .

// Get an object's key by value
var getKey = function( obj, value ) {
    var inverse = _.invert( obj );
    return _.get( inverse, value, false );
};

// US states used as an example
var states = {
    "AL": "Alabama",
    "AK": "Alaska",
    "AS": "American Samoa",
    "AZ": "Arizona",
    "AR": "Arkansas",
    "CA": "California",
    "CO": "Colorado",
    "CT": "Connecticut",
    "DE": "Delaware",
    "DC": "District Of Columbia",
    "FM": "Federated States Of Micronesia",
    "FL": "Florida",
    "GA": "Georgia",
    "GU": "Guam",
    "HI": "Hawaii",
    "ID": "Idaho",
    "IL": "Illinois",
    "IN": "Indiana",
    "IA": "Iowa",
    "KS": "Kansas",
    "KY": "Kentucky",
    "LA": "Louisiana",
    "ME": "Maine",
    "MH": "Marshall Islands",
    "MD": "Maryland",
    "MA": "Massachusetts",
    "MI": "Michigan",
    "MN": "Minnesota",
    "MS": "Mississippi",
    "MO": "Missouri",
    "MT": "Montana",
    "NE": "Nebraska",
    "NV": "Nevada",
    "NH": "New Hampshire",
    "NJ": "New Jersey",
    "NM": "New Mexico",
    "NY": "New York",
    "NC": "North Carolina",
    "ND": "North Dakota",
    "MP": "Northern Mariana Islands",
    "OH": "Ohio",
    "OK": "Oklahoma",
    "OR": "Oregon",
    "PW": "Palau",
    "PA": "Pennsylvania",
    "PR": "Puerto Rico",
    "RI": "Rhode Island",
    "SC": "South Carolina",
    "SD": "South Dakota",
    "TN": "Tennessee",
    "TX": "Texas",
    "UT": "Utah",
    "VT": "Vermont",
    "VI": "Virgin Islands",
    "VA": "Virginia",
    "WA": "Washington",
    "WV": "West Virginia",
    "WI": "Wisconsin",
    "WY": "Wyoming"
};

console.log( 'The key for "Massachusetts" is "' + getKey( states, 'Massachusetts' ) + '"' );

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

3voto

Ivan Zhang Punkte 31

Hier ist zunächst meine Lösung:

Nehmen wir zum Beispiel an, dass wir ein Objekt haben, das drei Wertepaare enthält:

function findKey(object, value) {

    for (let key in object)
        if (object[key] === value) return key;

    return "key is not found";
}

const object = { id_1: "apple", id_2: "pear", id_3: "peach" };

console.log(findKey(object, "pear"));
//expected output: id_2

Wir können einfach ein findKey(array, value) schreiben, das zwei Parameter benötigt, nämlich ein Objekt und den Wert des gesuchten Schlüssels. So ist diese Methode wiederverwendbar und Sie müssen das Objekt nicht jedes Mal manuell durchlaufen, indem Sie nur zwei Parameter für diese Funktion übergeben.

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