JavaScript 数组减少从索引开始

新手上路,请多包涵

这个问题已经困扰我一段时间了,我似乎无法在网上找到答案。

是否可以从某个索引开始使用 Array reduce 方法?

简单的例子

var studentGrades = ["John Doe", "Some School", 6, 7, 8, 7, 9, 9];

如果我只需要遍历 studentGrades 中的整数,我可以用一个简单的 for 循环来做到这一点

for(var i = 2; i < studentGrades.length; i++) {
  // do stuff here ...
}

但是假设我需要得到一个平均成绩,它是所有整数的总和除以整数计数。如果 Array 只包含整数,那么使用 reduce 就没有问题。

 var onlyIntegersArr = [5,2,3,4];
var averageGrade = onlyIntegersArr.reduce(function(a,b){
  return a + b;
}) / onlyIntegersArr.length;

但是,如果我知道出于某种原因我需要跳过前两个 Array 元素并从索引 Array[2] 开始。

因此,例如,我会将 reduce 应用于 studentGrades ,但仅从索引 studentGrades[2] 开始。

reduce 有可能吗?

感谢您提供解决方案,我喜欢 切片 方法,但在这种情况下我不喜欢使用新方法。

例如

var average = studentGrades.reduce(function(a,b,i){
  return i >= 2 ? a+b : 0;
}) / (studentGrades.length - 2);

原文由 JanisSt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 368
2 个回答

reduce 的第三个参数是一个索引,这里是 小提琴

var averageGrade = onlyIntegersArr.reduce(function (a, b, c) {
    if (c >= 2) {
        return a + b;
    } else {
        return 0;
    }
});

如果数组在第二个索引之后有更多的非数字项,那么检查这个 小提琴

var studentGrades = ["John Doe", "Some School", 6, 7, 8, 7, 9, 9, "Some School"];
var averageGrade = studentGrades.reduce(function (a, b, c) {
    if (c >= 2 && !isNaN(b)) {
        return a + b;
    } else if (c >= 2) {
        return a + 0;
    } else {
        return 0;
    }
})
alert(averageGrade);

原文由 gurvinder372 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果你知道你想跳过第一个 n 元素,你可以使用 Array#slice

使用 ES2015 箭头函数

var sum = array.slice(n).reduce((a, b) => a + b);

 var studentGrades = ["John Doe", "Some School", 6, 7, 8, 7, 9, 9];
var sum = studentGrades.slice(2).reduce((a, b) => a + b);

document.body.innerHTML = 'SUM is = ' + sum;

在 ES5 中,可以使用匿名函数编写相同的代码。

 var sum = array.slice(n).reduce(function(a, b) {
    return a + b;
});

 var studentGrades = ["John Doe", "Some School", 6, 7, 8, 7, 9, 9];
var sum = studentGrades.slice(2).reduce(function(a, b) {
    return a + b;
});

document.body.innerHTML = 'SUM is = ' + sum;

对于您提到的情况,只添加数值,而不管它们在数组中的位置 - 您可以做类似的事情

var sum = array.reduce(function(result, v) {
    return result + (parseFloat(v) || 0);
}, 0);

 var studentGrades = ["John Doe", "Some School", 6, 7, 8, 7, 9, 9];
var sum = studentGrades.reduce(function(result, v) {
    return result + (parseFloat(v) || 0);
}, 0);

document.body.innerHTML = 'SUM is = ' + sum;

原文由 Jaromanda X 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题