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.

1voto

DINA TAKLIT Punkte 4596

Wenn Sie ein Objekt mit Array-Werte . Hier ist ein gutes Beispiel. Nehmen wir an, Sie möchten ein Symbol anzeigen, das auf der Erweiterung der Datei basiert, die Sie haben. Alle Erweiterungen mit demselben Symbol werden unter demselben Objektwert angezeigt.

Hinweis: Es ist besser, die Fälle hier in ein Objekt zu verpacken, als einen Schalter mit vielen Fällen zu verwenden.

Sehen Sie sich den folgenden Codeausschnitt an (geschrieben in es6 ), um zu sehen, wie wir den spezifischen Schlüssel für die spezifische Erweiterung zurückgeben.

Ich habe die Liste der Erweiterungen von dieser Seite Trottelpaket

// Oject that contains different icons for different extentions
const icons = {
    "music": ["mp3", "m4a", "ogg", "acc", "flac","m3u", "wav"],
    "video": ["mp4","webm", "mkv", "avi", "mov", "m4v", "mpeg"],
    "image": ["jpg", "gif", "png", "jpeg", "tif", "psd", "raw", "ico"],
    "archives": ["zip", "rar", "tar", "dmg", "jar"],
    "3d-files": ["3ds", "dwg", "obj", "dae", "skp", "fbx"],
    "text": ["doc", "rtf", "txt", "odt", "tex"],
    "vector-graphics":["ai", "svg"],
    "pdf": ["pdf"],
    "data": ["xml", "csv", "xls"]
}

const get_icon_Key =( icons_object,file_extention) => {
   // For each key we chack if the value is contained in the list of values
   let key = Object.keys(icons_object).find(
    k=> icons[k].find(
            // At this leve we check if the extention exist in the array of the specific object value ie. 'music', 'video' ...
            icons_ext => icons_ext === file_extention)  
            // if we find it means this is the key we are looking for
            ? true: false);
    return key
}

console.log(`The icon of for mp3 extention is: => ${get_icon_Key(icons,"mp3")}`)
console.log(`The icon of for mp4 extention is: => ${get_icon_Key(icons,"mp4")}`)

0 Stimmen

Warum verweisen Sie auf das äußere Icons-Objekt in der Funktion, wenn Sie es in irgendeiner Weise als icons_object übergeben?

1voto

l3x Punkte 29224

Ich empfehle normalerweise lodash statt underscore.

Wenn Sie sie haben, benutzen Sie sie.

Wenn nicht, dann sollten Sie das npm-Paket lodash.invert verwenden, das ziemlich klein ist.

Hier sehen Sie, wie Sie es mit Gulp testen können:

1) Erstellen Sie eine Datei namens gulpfile.js mit folgendem Inhalt:

// Filename: gulpfile.js
var gulp = require('gulp');
var invert = require('lodash.invert');   
gulp.task('test-invert', function () {
  var hash = {
    foo: 1,
    bar: 2
  };
  var val = 1;
  var key = (invert(hash))[val];  // << Here's where we call invert!
  console.log('key for val(' + val + '):', key);
});

2) Installieren Sie das Paket lodash.invert und gulp

$ npm i --save lodash.invert && npm install gulp

3) Testen Sie, ob es funktioniert:

$ gulp test-invert
[17:17:23] Using gulpfile ~/dev/npm/lodash-invert/gulpfile.js
[17:17:23] Starting 'test-invert'...
key for val(1): foo
[17:17:23] Finished 'test-invert' after 511 s

Referenzen

https://www.npmjs.com/package/lodash.invert

https://lodash.com/

Unterschiede zwischen lodash und underscore

https://github.com/gulpjs/gulp

0 Stimmen

Warum ist Gulp hier involviert? Führen Sie einfach das Skript aus

0voto

onepix Punkte 269

Ganz einfach.

const CryptoEnum = Object.freeze({
                    "Bitcoin": 0, "Ethereum": 1, 
                    "Filecoin": 2, "Monero": 3, 
                    "EOS": 4, "Cardano": 5, 
                    "NEO": 6, "Dash": 7, 
                    "Zcash": 8, "Decred": 9 
                  });

Object.entries(CryptoEnum)[0][0]
// output => "Bitcoin"

0voto

noctis_atrae Punkte 33

Ich weiß, ich bin spät dran, aber was halten Sie von dieser EMCMAScript 2017 Lösung, die ich heute gefunden habe ? Sie behandelt Mehrfachübereinstimmungen, denn was passiert, wenn zwei Schlüssel die gleichen Werte haben? Aus diesem Grund habe ich dieses kleine Snippet erstellt.

Bei einer Übereinstimmung wird nur eine Zeichenkette zurückgegeben, bei mehreren Übereinstimmungen wird ein Array zurückgegeben.

let object = { nine_eleven_was_a_inside_job: false, javascript_isnt_useful: false }

// Complex, dirty but useful. Handle mutiple matchs which is the main difficulty.
Object.prototype.getKeyByValue = function (val) {

  let array = [];
  let array2 = [];

  // Get all the key in the object.
  for(const [key] of Object.entries(this)) {
    if (this[key] == val) {
      // Putting them in the 1st array.
      array.push(key)
    }
  }

  // List all the value of the 1st array.
  for(key of array) {
    // "If one of the key in the array is equal to the value passed in the function (val), it means that 'val' correspond to it."
    if(this[key] == val) {
      // Push all the matchs. 
      array2.push(key);
    }
  }

  // Check the lenght of the array.
  if (array2.length < 2) {
    // If it's under 2, only return the single value but not in the array. 
    return array2[0];
  } else {
    // If it's above or equal to 2, return the entire array.
    return array2; 
  }
}

/*

Basic way to do it wich doesn't handle multiple matchs.

let getKeyByValue = function (object, val) {
  for(const [key, content] of Object.entries(object)) {
    if (object[key] === val) {
      return key
    }
  }
}
*/

console.log(object.getKeyByValue(false))

0voto

KARTHIKEYAN.A Punkte 14230

Wir können eine einfache Funktion verwenden, um den Wert des übergebenen Schlüssels wie folgt zu erhalten

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

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