是否有内置的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捷径。
答案 0 :(得分:67)
_.chain(params)
.keyBy('name')
.mapValues('input')
.value();
或
_.mapValues(_.keyBy(params, 'name'), 'input')
或_.reduce
_.reduce(
params,
(acc, { name, input }) => ({ ...acc, [name]: input }),
{}
)
答案 1 :(得分:25)
是PHP extension,使用_.reduce
var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
_.reduce(params , function(obj,param) {
obj[param.name] = param.input
return obj;
}, {});
答案 2 :(得分:21)
您应该使用_.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>
&#13;
如果需要,可以在使用_.keyBy之前操作数组,或者在使用_.keyBy之后使用对象来获取所需的结果。
答案 3 :(得分:10)
您可以使用带有array reduce方法和ES6 destructuring的单行内容javascript将键值对的数组转换为对象。
arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
答案 4 :(得分:3)
它也可以在不使用任何lodash函数的情况下解决:
let paramsVal = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
let output = {};
paramsVal.forEach(({name, input})=>{
output[name] = input;
})
console.log(output);
答案 5 :(得分:3)
这似乎是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]})));
(感谢Ben Steward,很好的思考...)
答案 6 :(得分:2)
这可能比你想要的更冗长,但是你要求稍微复杂的操作,因此可能涉及实际的代码(恐怖)。
我的建议,zipObject
非常合乎逻辑:
validate, invalidate, paintComponent, paint
使用fromPairs
:
_.zipObject(_.map(params, 'name'), _.map(params, 'input'));
匿名函数显示hackiness - 我不相信JS保证对象迭代中元素的顺序,因此调用_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));
不会。
答案 7 :(得分:1)
使用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);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
&#13;