Есть ли встроенная функция lodash для этого:
var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
И выведите это:
var output = {
foo: 'bar',
baz: 'zle'
};
Сейчас я просто использую Array.prototype.reduce()
:
function toHash(array, keyName, valueName) {
return array.reduce(function(dictionary, next) {
dictionary[next[keyName]] = next[valueName];
return dictionary;
}, {});
}
toHash(params, 'name', 'input');
Интересно, есть ли короткий путь к lodash.
javascript
lodash
ядро
источник
источник
_.keyBy
преобразует весь массив в объект, тогда как вопрос в основном заключается в том, чтобы иметь один элемент из каждого объекта в массиве в качестве ключа и еще один элемент в качестве его значения. Если_.keyBy
используется, то все значения будут объектами.Вы должны использовать _.keyBy, чтобы легко преобразовать массив в объект.
Документы здесь
Пример использования ниже:
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; console.log(_.keyBy(params, 'name'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
При необходимости вы можете манипулировать массивом перед использованием _.keyBy или объектом после использования _.keyBy, чтобы получить точный желаемый результат.
источник
Да, это здесь , используя
_.reduce
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; _.reduce(params , function(obj,param) { obj[param.name] = param.input return obj; }, {});
источник
reduce()
появляется другой вариант использования. Умный способ сделать это!_.reduce
если это точно не выражает то, что вы пытаетесь сделать: это значительно затемняет смысл кода в любом другом случае. Я лично предпочитаю_.zipObject
решение @djechlin - в противном случае подход_.keyBy
/_.mapValues
.Это похоже на работу для Object.assign:
const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));
Отредактировано так, чтобы обернуть как функцию, аналогичную OP, это будет:
const toHash = (array, keyName, valueName) => Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));
(Спасибо Бену Стюарду, хорошие мысли ...)
источник
Вы можете использовать один лайнер javascript с методом уменьшения массива и деструктуризацией ES6 для преобразования массива пар ключ-значение в объект.
arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
источник
Это, вероятно, более многословно, чем вы хотите, но вы просите немного сложную операцию, поэтому может быть задействован реальный код (ужас).
Моя рекомендация,
zipObject
это довольно логично:_.zipObject(_.map(params, 'name'), _.map(params, 'input'));
Другой вариант, более хитрый, с использованием
fromPairs
:_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));
Анонимная функция показывает хакерство - я не верю, что JS гарантирует порядок элементов в итерации объекта, поэтому вызов
.values()
не подходит .источник
fromPairs
, да и звонкиvalues()
действительно не годятся. По крайней мере, с точки зрения удобочитаемости.Другой способ с lodash
создание пар, а затем либо построить объект, либо
ES6 Map
легко_(params).map(v=>[v.name, v.input]).fromPairs().value()
или
_.fromPairs(params.map(v=>[v.name, v.input]))
Вот рабочий пример
Показать фрагмент кода
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; var obj = _(params).map(v=>[v.name, v.input]).fromPairs().value(); console.log(obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
источник
Object.fromEntries(params.map(v => [v.name, v.input]))
Его также можно решить без использования какой-либо функции lodash, например:
let paramsVal = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; let output = {}; paramsVal.forEach(({name, input})=>{ output[name] = input; }) console.log(output);
источник