能否通过forEach的返回值直接构建对象?附现有及期望实现代码
能不能用forEach的返回值构建对象?
嘿,这个问题我太清楚啦!直接通过forEach的返回值来构建对象是行不通的——因为Array.prototype.forEach()方法的返回值固定是undefined,不管你在回调函数里写了什么逻辑,它最后都不会返回任何有实际意义的值。
为什么你当前的写法能工作?
你现在的代码:
const data = {}; object.rules.forEach(rule => { data[rule.name] = { body: [], type: rule.type }; });
其实是在修改外部预先声明的data对象,forEach只是负责遍历数组执行回调,并没有把构建好的对象返回给你。
为什么期望的写法会失效?
如果你写成:
const data = object.rules.forEach(rule => { data[rule.name] = { body: [], type: rule.type }; });
最终data的值会是undefined,完全达不到你想要的构建对象的目的。
正确的实现方式:用reduce替代forEach
想要直接通过数组遍历的返回值得到目标对象,Array.prototype.reduce()才是正确的选择——它专门用来把数组归约成单个值(比如对象):
const data = object.rules.reduce((acc, rule) => { // 把当前规则对应的键值对加到累加器对象里 acc[rule.name] = { body: [], type: rule.type }; // 一定要返回累加器,供下一次遍历使用 return acc; }, {}); // 初始值是空对象,作为累加器的起点
这样写就完全符合你想要的“直接赋值得到目标对象”的需求,不需要提前声明空对象,代码也更简洁、更符合函数式编程的风格。
补充:如果一定要用forEach?
要是你坚持想用forEach,那只能保留你最初的写法:先声明空对象,再在forEach的回调里修改它——因为forEach确实没有返回值,没法直接用来赋值构建对象。
内容的提问来源于stack exchange,提问作者FXux
相关产品推荐
相关产品推荐

