Lodash: возвращает первый ключ объекта, значение которого (i.E массив) имеет заданный элемент (i.e строка) в нем

у меня есть объект типа:

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

и я знаю элемент массива (скажем, "c") значения ключа объекта тогда как найти первое ключевое значение i.e " 03 " использование lodash без использования if else?

Я пробовал так, используя lodash, и если еще:

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

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

ожидаемый результат: первый ключ i.e "03", если элемент соответствует другому"".

после просмотра комментарии: теперь мне также интересно узнать о

нужно ли мне использовать собственный javascript(трудно читаемая программа в случаях, если мы используем более 2 блоков if) или lodash (легко читаемое программное решение в одной строке)?

4 ответов


так как вы просто хотите способ найти ключ с помощью простой команды Lodash, должно работать следующее:

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

или, используя синтаксис ES6,

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

это возвращает " 03 " для вашего примера.

функция предиката-второй аргумент для findKey() - имеет автоматический доступ к значению ключа. Если не найдено ничего, соответствующего функции предиката,undefined возвращается.

документация findKey() is здесь.


примеры взяты из документации:

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'

ирония в том, что это не сложнее реализовать без каких-либо либов.

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

здесь приходит один линейный ответ из будущего. В настоящее время работает только в Firefox 47 на. Часть предложения 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);

в качестве альтернативного решения: рассмотрим собственный подход Javascript с использованием Object.keys и 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"