为什么javascript reduce函数输出字符串数组

时间:2018-08-23 09:19:32

标签: javascript arrays reduce

我试图总结一个数组中的数字,例如从这里开始: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函数对对象序列数组中的数字求和...所以我想知道这里出了什么问题吗?

2 个答案:

答案 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)