是否可以从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 }
})
答案 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.assign
与spread syntax ...
和Array#map
用于单个对象。
const data = Object.assign(...object.rules.map(
rule => ({ [rule.name]: { body: [], type: rule.type } }))
);
name
type
和const data = Object.assign(...object.rules.map(
({ name, type }) => ({ [name]: { body: [], type } }))
);
以及destructuring assignment
{{1}}