Jan*_*sSt 10 javascript arrays reduce
这个问题一直困扰着我一段时间,我似乎无法在网上找到答案.
是否可以从某个索引开始使用Array reduce方法?
简单的例子
var studentGrades = ["John Doe", "Some School", 6, 7, 8, 7, 9, 9];
Run Code Online (Sandbox Code Playgroud)
如果我只需要在studentGrades中遍历整数,我可以通过简单的for循环来完成
for(var i = 2; i < studentGrades.length; i++) {
// do stuff here ...
}
Run Code Online (Sandbox Code Playgroud)
但是,假设我需要得到一个平均等级,它是所有整数除以整数计数的总和.如果Array只包含整数,那么使用reduce就没有问题.
var onlyIntegersArr = [5,2,3,4];
var averageGrade = onlyIntegersArr.reduce(function(a,b){
return a + b;
}) / onlyIntegersArr.length;
Run Code Online (Sandbox Code Playgroud)
但是,如果我知道无论出于何种原因我需要跳过前两个数组元素并从索引数组[2]开始.
因此,例如我将reduce应用于studentGrades,但仅从index studentGrades开始[2].
减少可能吗?
谢谢你的解决方案,我喜欢切片方法,但我不喜欢在这种情况下使用新方法.
例如
var average = studentGrades.reduce(function(a,b,i){
return i >= 2 ? a+b : 0;
}) / (studentGrades.length - 2);
Run Code Online (Sandbox Code Playgroud)
如果您知道要跳过第一个n元素的事实,则可以使用Array#slice
使用ES2015 箭头功能
var sum = array.slice(n).reduce((a, b) => a + b);
Run Code Online (Sandbox Code Playgroud)
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;Run Code Online (Sandbox Code Playgroud)
在ES5中,可以使用匿名函数编写相同的代码.
var sum = array.slice(n).reduce(function(a, b) {
return a + b;
});
Run Code Online (Sandbox Code Playgroud)
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;Run Code Online (Sandbox Code Playgroud)
对于你提到的情况,只是添加数值,无论它们在数组中的哪个位置 - 你都可以做类似的事情
var sum = array.reduce(function(result, v) {
return result + (parseFloat(v) || 0);
}, 0);
Run Code Online (Sandbox Code Playgroud)
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;Run Code Online (Sandbox Code Playgroud)
var averageGrade = onlyIntegersArr.reduce(function (a, b, c) {
if (c >= 2) {
return a + b;
} else {
return 0;
}
});
Run Code Online (Sandbox Code Playgroud)
如果数组在第二个索引之后有更多非数字项,则检查此小提琴
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);
Run Code Online (Sandbox Code Playgroud)