it-swarm.com.de

Lodash: gibt den ersten Schlüssel eines Objekts zurück, dessen Wert (d. H. Array) ein bestimmtes Element (d. H. String) enthält

Ich habe ein Objekt wie:

var obj = {
  "01": ["a","b"],
  "03": ["c","d"],
  "04": ["e","c"]
};

und ich kenne ein Array-Element (sage "c") des Werts des Objektschlüssels dann Wie finde ich den ersten Schlüsselwert, d. h.

Ich habe es mit lodash versucht und wenn ja:

var rId = "";
_.forOwn(obj, function (array, id) {
     if (_.indexOf(array, "c") >= 0) {
           rId = id;
           return false;
     }
});

console.log(rId); // "03"

Erwartetes Ergebnis: erster Schlüssel, dh "03", wenn das Element mit "" übereinstimmt.

Nachdem ich Kommentare gesehen habe: Jetzt bin ich auch neugierig, etwas darüber zu erfahren 

Muss ich mit nativem Javascript (schwer lesbares Programm in den Fällen, wenn wir mehr als zwei Blöcke verwenden) oder lodash-Methode (leicht lesbare Programmlösung in einer Zeile) gehen?

14
Sandeep Sharma

Da Sie nur einen Weg suchen möchten, um einen Schlüssel mit einem einfachen Lodash-Befehl zu finden, sollte Folgendes funktionieren:

_.findKey(obj, function(item) { return item.indexOf("c") !== -1; });

oder mit ES6-Syntax 

_.findKey(obj, (item) => (item.indexOf("c") !== -1));

Dies gibt "03" für Ihr Beispiel zurück.

Die Prädikatsfunktion - das zweite Argument für findKey() - hat automatischen Zugriff auf den Wert des Schlüssels. Wenn nichts gefunden wird, das mit der Prädikatsfunktion übereinstimmt, wird undefined zurückgegeben.

Dokumentation für findKey() ist hier .


Beispiele aus der Dokumentation:

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'
27
Akshat Mahajan

Die Ironie ist, dass es nicht schwieriger ist, ohne libs zu implementieren.

Object.keys(obj).filter(x => obj[x].includes("c"))[0]

Hier kommt eine Antwort aus der Zukunft. Funktioniert derzeit nur in Firefox 47. Teil des ES7-Vorschlags.

var obj = {
  "01": ["a","b"],
  "03": ["c","d"],
  "04": ["e","c"]
},
    res = Object.entries(obj).find(e => e[1].includes("c"))[0];
document.write(res);

1
Redu

Als alternative Lösung: Erwägen Sie den nativen Javascript-Ansatz mit den Funktionen Object.keys und Array.some:

var obj = {"01": ["a","b"],"03": ["c","d"],"04": ["e","c"]},
        search_str = "c", key = "";

Object.keys(obj).some(function(k) { return obj[k].indexOf(search_str) !== -1 && (key = k); });
// the same with ES6 syntax:
// Object.keys(obj).some((k) => obj[k].indexOf(search_str) !== -1 && (key = k));

console.log(key);  // "03"
0
RomanPerekhrest