web-dev-qa-db-fra.com

Lodash: retourne la première clé de l'objet dont la valeur (i.e Array) contient un élément donné (i.e string)

J'ai un objet comme:

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

et je connais un élément de tableau (disons "c") de la valeur de la clé d'objet puis Comment trouver la première valeur de clé, c.-à-d. "03" en utilisant lodash sans utiliser if else?

J'ai essayé comme ça en utilisant lodash et sinon:

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

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

Résultat attendu: la première clé est "03" si l'élément correspond à "".

Après avoir lu les commentaires: Maintenant, je suis aussi curieux de connaître 

Dois-je utiliser le javascript natif (programme difficile à lire dans les cas où nous utilisons plus de 2 blocs si) ou lodash (solution de programme facilement lisible sur une ligne)?

14
Sandeep Sharma

Puisque vous voulez juste trouver un moyen de trouver une clé en utilisant une simple commande Lodash, voici ce qui devrait fonctionner:

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

ou, en utilisant la syntaxe ES6, 

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

Cela retourne "03" pour votre exemple.

La fonction de prédicat - le deuxième argument de findKey() - a un accès automatique à la valeur de la clé. Si rien ne correspond à la fonction de prédicat, undefined est renvoyé.

La documentation pour findKey() est ici .


Exemples tirés de la documentation:

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

L'ironie est qu'il n'est pas plus difficile à mettre en œuvre sans libs.

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

Voici une réponse simple du futur. Actuellement, ne fonctionne que dans Firefox 47. Partie de la proposition ES7.

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

Comme solution alternative: envisagez l’approche Javascript native en utilisant les fonctions Object.keys et 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