Javascript 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

是否有内置的lodash函数来执行此操作:

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]})));