将数组映射到对象

是否有一个内置的 loash 函数来实现这一点:

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');

不知道有没有什么捷径。

184294 次浏览

是的,它是 给你,使用 _.reduce

var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];


_.reduce(params , function(obj,param) {
obj[param.name] = param.input
return obj;
}, {});

这可能比您想要的更加详细,但是您要求的操作稍微复杂一些,因此可能涉及到实际的代码(这太可怕了)。

对于 zipObject,我的建议是很合理的:

_.zipObject(_.map(params, 'name'), _.map(params, 'input'));

使用 fromPairs的另一种选择,更加古怪:

_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));

匿名函数显示了黑客行为——我不相信 JS 能保证对象迭代中元素的顺序,所以调用 .values()是不行的。

洛达什4.17.2的另一种方式

_.chain(params)
.keyBy('name')
.mapValues('input')
.value();

或者

_.mapValues(_.keyBy(params, 'name'), 'input')

或者 _.reduce

_.reduce(
params,
(acc, { name, input }) => ({ ...acc, [name]: input }),
{}
)

您应该使用 _. 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>

If required, you can manipulate the array before using _.keyBy or the object after using _.keyBy to get the exact desired result.

另一种方式与洛达什

创建对,然后要么构造一个对象或 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>

您可以使用一行 javascript 和 数组减少方法以及 ES6正在解体来将键值对的数组转换为对象。

arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});

它也可以不使用任何像下面这样的 loash 函数来求解:

let paramsVal = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
let output = {};


paramsVal.forEach(({name, input})=>{
output[name] = input;
})




console.log(output);

enter image description here

这看起来像是 Object.sign 的一个任务:

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 的好主意...)