从forEach创建对象

时间:2016-08-03 20:43:08

标签: javascript functional-programming javascript-objects

我试图找出是否有办法将此代码重写为单个对象:

my_array = [
  {key: 1, value: "foo"},
  {key: 2, value: "bar"}
];

let my_obj = {};
my_array.forEach((elem) => {
  my_obj[elem.key] = elem.value;
});

我想做的是:

my_array = [
  {key: 1, value: "foo"},
  {key: 2, value: "bar"},
];

const my_obj = ...?

有没有办法进行与forEach电话相当的一次性转换?

3 个答案:

答案 0 :(得分:9)

您可以使用Array.prototype.reduce()

实现此目的



var my_array = [{key: 1, value:"foo"}, {key: 2, value:"bar"}];
  
var my_object = my_array.reduce(function(prev, curr) {
  prev[curr.key] = curr.value;
  return prev;
}, {});

console.log(my_object); // {"1": "foo", "2": "bar"}




或者,使用ES6语法:

const my_object = my_array.reduce((prev, curr) => {
    prev[curr.key] = curr.value;
    return prev;
}, {});

答案 1 :(得分:2)

您可以使用reduce功能。它应该像这样工作:

my_array = [
  {key: 1, value: "foo"},
  {key: 2, value: "bar"}
];

let my_obj = my_array.reduce(function(obj, elem) {
    obj[elem.key] = elem.value;
    return obj;
}, {});

// my_obj = { "1": "foo", "2": "bar" }

答案 2 :(得分:2)

在ES6中,您可以使用Object.assign

const obj = Object.assign({}, ...my_array.map(x => ({ [x.key]: x.value })));

// Or:
const obj = Object.assign({}, ...my_array.map(({ key, value }) => ({ [key]: value })));

这会将每个{ key: foo, value: bar }转换为{ foo: bar },然后使用Object.assign将它们合并为一个对象。 (spread operator用作Object.assign需要变量参数列表。)