Javascript lodash:将数组映射到对象
是否有内置的lodash函数来执行此操作:Javascript lodash:将数组映射到对象,javascript,lodash,Javascript,Lodash,是否有内置的lodash函数来执行此操作: var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; 并输出以下内容: var output = { foo: 'bar', baz: 'zle' }; 现在我只使用了Array.prototype.reduce(): 想知道是否有一条洛达斯捷径。是的,使用\uu减少 var params = [ { na
var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
并输出以下内容:
var output = {
foo: 'bar',
baz: 'zle'
};
现在我只使用了Array.prototype.reduce()
:
想知道是否有一条洛达斯捷径。是的,使用\uu减少
var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
_.reduce(params , function(obj,param) {
obj[param.name] = param.input
return obj;
}, {});
_.reduce(
params,
(acc, { name, input }) => ({ ...acc, [name]: input }),
{}
)
这可能比您想要的更详细,但您要求的是一个稍微复杂的操作,因此可能会涉及实际代码(恐怖)
我的建议很合理:
_.zipObject(_.map(params, 'name'), _.map(params, 'input'));
另一个选项,更黑客,使用:
匿名函数显示了黑客行为——我不相信JS能保证对象迭代中元素的顺序,所以调用.values()
就不行了。另一种方法是
或
或使用。
var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
_.reduce(params , function(obj,param) {
obj[param.name] = param.input
return obj;
}, {});
_.reduce(
params,
(acc, { name, input }) => ({ ...acc, [name]: input }),
{}
)
您应该使用u.keyBy轻松地将数组转换为对象
用法示例如下:
var参数=[
{name:'foo',输入:'bar'},
{name:'baz',输入:'zle'}
];
log(u.keyBy(params,'name'))代码>
用lodash的另一种方法
创建对,然后轻松构建对象或ES6映射
(params).map(v=>[v.name,v.input]).fromPairs().value()
或
\uu.fromPairs(参数映射(v=>[v.name,v.input]))
下面是一个工作示例
var参数=[
{name:'foo',输入:'bar'},
{name:'baz',输入:'zle'}
];
var obj=(params).map(v=>[v.name,v.input]).fromPairs().value();
控制台日志(obj)代码>
您可以使用带有方法和的一行javascript将键值对数组转换为对象
arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
它也可以在不使用任何lodash函数的情况下进行求解,如下所示:
let paramsVal = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
let output = {};
paramsVal.forEach(({name, input})=>{
output[name] = input;
})
console.log(output);
这似乎是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,好主意……我看不出使用配对的fromPairs
,调用values()
确实没用。至少从可读性的角度来看。首先看看这个,了解斯塔索夫拉斯的大多数投票答案。这是一个很酷的答案,但它并没有回答这个问题。值应该是字符串而不是对象。可以将其包装在父函数中,以便用户可以通过传递它们来确定将使用哪些键,就像OP一样。不幸的是,这是O(n^2)。再次使用另一个用例。聪明的做法!有人得到这个类型脚本的版本吗?事实是,从数学上讲,你可以使用reduce/inject实现任何迭代操作,因为reduce同构于一个列表。然而,这种灵活性是以可读性为代价的。不要使用。
,除非它准确地表达了您要做的事情:在任何其他情况下,它都会明显模糊代码的要点。我个人更喜欢@djechlin的.zipObject
解决方案——如果不行,则使用.keyBy
/.mapValues
方法。@Akrikos的.keyBy
将整个数组转换为一个对象,而问题主要是数组中每个对象的一项作为键,另一项作为值。如果使用了。.keyBy
,那么所有值都将是对象。谢谢@MustafaEhsanAlokozay你是对的,这个答案并不完全正确。我将删除我的评论,因为它没有帮助。这可能会让你的评论看起来很奇怪,但总比让我不正确的评论继续存在要好。这个解决方案的好处在于它在普通的ES中也是可行的:Object.fromEntries(params.map(v=>[v.name,v.input])
@fregante,仅限Chrome73+
const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));
const toHash = (array, keyName, valueName) =>
Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));