我试图总结一个数组中的数字,例如从这里开始:https://jsfiddle.net/4r8dtxhz/12/
这是代码:
var someObj = [{name:"hi", series: [1,2,10,4,5,6]},{name:"ho",series:[3,7,6,9,12,1,3,20,3,1]}]
for (var doc of someObj) {
this.min = doc.series.reduce((agg,val) => val < agg? val:agg, doc.series[0]);
this.max = doc.series.reduce((agg,val) => val > agg? val:agg, doc.series[0]);
}
console.log(max)
var test = Array.from(someObj.map((doc)=>doc.series)).reduce((accumulator, currentValue) => accumulator + currentValue);
console.log(typeof test)
console.log(test)
我期望reduce函数对对象序列数组中的数字求和...所以我想知道这里出了什么问题吗?
答案 0 :(得分:4)
您的地图函数正在生成[someObj[0].series, someObj[1].series]
的二维数组。
当您在化简器中使用+
运算符将两个数组加在一起时,它会将它们转换为字符串并连接该字符串。
如果要创建每个系列的和的数组,请引入另一个内部具有减法的map函数。
答案 1 :(得分:3)
您缺少将地图步骤的结果展平的步骤。您的代码
someObj.map((doc) => doc.series)
将返回一个数组数组(或2D数组),而不是一个平面数组。
如果您在map
步骤之后添加了平坦化2D数组的步骤,例如,
.reduce((flattened, series) => flattened.concat(series))
再次使用Array.reduce
-您将获得预期的结果。
请注意,您应始终为reduce
的累加器提供初始值(在您的情况下,缺少0
来求和),以确保+
正确地解析为数字加法(否则将是字符串连接,例如[1]+[2] === '12'
)。
另外,Array.from
并不是必需的,因为someObj
已经是一个数组(Array.from
从 Iterable 对象转换为Array
)。
var someObj = [{name:"hi", series: [1,2,10,4,5,6]},{name:"ho",series:[3,7,6,9,12,1,3,20,3,1]}]
for (var doc of someObj) {
this.min = doc.series.reduce((agg,val) => val < agg? val:agg, doc.series[0]);
this.max = doc.series.reduce((agg,val) => val > agg? val:agg, doc.series[0]);
}
console.log(max)
var test = someObj.map((doc)=>doc.series)
.reduce((flattened, series) => flattened.concat(series))
.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
console.log(typeof test)
console.log(test)