[英]lodash: mapping array to object
是否有内置的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捷径。
您应该使用_.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;
}, {});
这似乎是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,好主意...)
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.