从forEach返回对象?

时间:2018-01-06 15:36:12

标签: javascript node.js

是否可以从forEach的返回构造一个对象?我是怎么做的:

const data = {}
object.rules.forEach(rule => {
  data[rule.name] = { body: [], type: rule.type }
})

我想怎么做:

const data = object.rules.forEach(rule => {
  data[rule.name] = { body: [], type: rule.type }
})

4 个答案:

答案 0 :(得分:4)

考虑使用Array.reduce

const data = object.rules.reduce((obj, rule) => {
  obj[rule.name] = { body: [], type: rule.type }
  return obj;
}, {})

和更短的版本

const data = object.rules.reduce((obj, rule) => Object.assign({}, obj, {[rule.name]:{ body: [], type: rule.type } }), {})

答案 1 :(得分:2)

每当您想要将数组转换为另一个不是数组的结构时,reduction就是您的朋友。

console.log(
  ['a', 'b', 'c'].reduce((obj, char, index) => {
    obj[char] = index;
    return obj;
  }, {})
)

答案 2 :(得分:1)

不,您不能将forEach用于此目的。在数组对象上调用forEach会将您提供给forEach的回调函数应用于数组对象中的每个元素。

您可以将reduce用于此目的,

  

对累加器和每个元素应用一个函数   数组(从左到右)将其减少为单个值

const data = object.rules.reduce(function(obj, rule) {
    obj[rule.name] = { body: [], type: rule.type }
    return obj;
}, {});

有关此方法的详细说明,请查看here

答案 3 :(得分:1)

您可以将Object.assignspread syntax ...Array#map用于单个对象。

const data = Object.assign(...object.rules.map(
    rule => ({ [rule.name]: { body: [], type: rule.type } }))
);

name typeconst data = Object.assign(...object.rules.map( ({ name, type }) => ({ [name]: { body: [], type } })) ); 以及destructuring assignment

{{1}}