Lodash: возвращает первый ключ объекта, значение которого (например, Array) имеет данный элемент (например, строку) в нем
У меня есть объект вроде:
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", если элемент соответствует else "".
После просмотра комментариев: Теперь мне также интересно узнать о
Нужно ли мне работать с собственным javascript (трудно читать программу в случаях, если мы используем более двух блоков if) или lodash (легко читаемое программное решение в одной строке)?
Ответы
Ответ 1
Поскольку вам просто нужен способ найти ключ, используя простую команду Lodash, необходимо следующее:
_.findKey(obj, function(item) { return item.indexOf("c") !== -1; });
или, используя синтаксис ES6,
_.findKey(obj, (item) => (item.indexOf("c") !== -1));
Это возвращает "03" для вашего примера.
Функция предиката - второй аргумент findKey()
- имеет автоматический доступ к значению ключа. Если ничего не найдено, соответствуя функции предиката, возвращается undefined
.
Документация для findKey()
здесь.
Примеры, взятые из документации:
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'
Ответ 2
Ирония заключается в том, что это не сложнее реализовать без каких-либо libs.
Object.keys(obj).filter(x => obj[x].includes("c"))[0]
Ответ 3
Вот один ответ линейки от будущего. В настоящее время работает только в 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);
Ответ 4
В качестве альтернативного решения: рассмотрим собственный подход 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"