减少返回undefined?

Spa*_*ich 6 javascript

我有一个名为student的对象,有两个属性,名称和分数.我正在尝试使用score属性执行计算,但是无法从学生阵列访问该属性.目前,我正在尝试使用以下代码获得分数的总和:

var sum = students.reduce(function(a, b) { 
                    return {sum: a.score + b.score}
                    })
Run Code Online (Sandbox Code Playgroud)

这将返回一个未定义的值,并导致firefox中的显示怪异.我似乎无法找到错误.有没有办法简单地访问参数,即var myVar = myArray.myObject.myProperty; ?

Eth*_*own 10

我认为你不了解它是如何reduce运作的.对于数组中的每个元素,它执行提供的函数.第一个参数是"累加器"; 在访问每个元素时传递的东西(实际上,它是来自最后一个元素的函数的返回值,但它通常用作累加器).第二个参数是被访问的元素.所以我认为你想要的是:

var sum = students.reduce(function(a, s) {
    a.sum += s.score;
    return a;
}, { sum: 0 });
Run Code Online (Sandbox Code Playgroud)

当您调用时reduce,您可以提供累加器的初始值(否则它将采用第一个元素的值,并且访问从第二个元素开始).在这里,我们提供一个sum属性设置为零的对象.

如果你想要的只是总和(不是具有sum属性的对象),它可以更简单:

var sum = students.reduce(function(a, s) {
    return a += s.score;
}, 0);
Run Code Online (Sandbox Code Playgroud)

  • @SpaceOstrich第一个参数是一个累加器,无论是一个运行总计,还是一个当前的最大/最小值,或者你要附加的对象,或者一个数组,它累积了你正在运行的操作的返回值,并且是相等的到之前的返回值.至于"为什么是0",如果`reduce`没有默认值,并且数组中有超过1个元素,那么第一次运行`reduce`使用`arr [0]作为a和arr [1] B`.在你的情况下,在用`map`转换它之前,你可以看到这会导致你需要检查`a`是一种形状还是另一种形状的问题. (2认同)