JS:每次从整个数组中获取 5 个项目并取平均值
JS: get 5 items each time from whole array and get average
我有一个数组,例如
var arr = [2,7,3,8,9,4,9,2,8,7,9,7,3,2,4,5,7,8,2,7,6,1,8];
我想要那个(我认为 for-loop 最适合这个循环)一个 for-loop 循环遍历整个数组并在数组中获得彼此靠近的 5 个项目和 运行s 一个函数这 5 项来计算它们的平均值。这当然必须重复,直到没有可用的 5 部分。上面的数组有 23 个值。所以当我应该在上面 运行 一个代码时,它可以在上面循环 4 次,因为不能再循环一次,因为它有 3/5 个值。
我考虑过这样做:
for (var i = 0; i < arr.length; i++) {
doThisFunction(i, i+1, i+2, i+3, i+4 );
}
但我认为这应该不会有效...有什么帮助吗?
您正在做某事,最简单的方法是
var arr = [2,7,3,8,9,4,9,2,8,7,9,7,3,2,4,5,7,8,2,7,6,1,8];
var result = [];
for (var i=0; (i+5)<arr.length; i=i+5) {
var average = (arr[i] + arr[i+1] + arr[i+2] + arr[i+3] + arr[i+4]) / 5;
result.push(average);
}
document.body.innerHTML = '<pre>' + JSON.stringify(result, null, 4) + '</pre>';
做同样事情的更高级的方法
var result = arr.map(function(x,i) {
return i%5===0 ? arr.slice(i, i+5).reduce(function(a,b) {return a+b}) / 5 : NaN;
}).filter(isFinite);
使用array.slice
:
for (var i = 0; i < Math.floor(arr.length/5); i++) {
f(arr.slice(i*5, i*5+5))
}
下面使用 reduce 和切片对数组中的一系列值求和。
function averageRange(arr, start, end) {
return (function(range) {
return range.reduce(
function(total, val) {
return total + val;
}, 0) / range.length;
}([].slice.apply(arr, [].slice.call(arguments, 1))))
}
function averageEveryN(arr, n) {
return arr.map(function(_, index, arr) {
return index % n === 0 ? averageRange(arr, index, index + count) : NaN;
}).filter(isFinite).slice(0, Math.floor(arr.length / n));
}
function println(text) {
document.getElementsByTagName('body')[0].innerHTML += text + '<br />';
}
var arr = [2, 7, 3, 8, 9, 4, 9, 2, 8, 7, 9, 7, 3, 2, 4, 5, 7, 8, 2, 7, 6, 1, 8];
var count = 5;
averageEveryN(arr, count).map(function(value, index) {
println((index + 1) + '.) ' + value.toFixed(4));
});
输出
1.) 5.8000
2.) 6.0000
3.) 5.0000
4.) 5.8000
我有一个数组,例如
var arr = [2,7,3,8,9,4,9,2,8,7,9,7,3,2,4,5,7,8,2,7,6,1,8];
我想要那个(我认为 for-loop 最适合这个循环)一个 for-loop 循环遍历整个数组并在数组中获得彼此靠近的 5 个项目和 运行s 一个函数这 5 项来计算它们的平均值。这当然必须重复,直到没有可用的 5 部分。上面的数组有 23 个值。所以当我应该在上面 运行 一个代码时,它可以在上面循环 4 次,因为不能再循环一次,因为它有 3/5 个值。
我考虑过这样做:
for (var i = 0; i < arr.length; i++) {
doThisFunction(i, i+1, i+2, i+3, i+4 );
}
但我认为这应该不会有效...有什么帮助吗?
您正在做某事,最简单的方法是
var arr = [2,7,3,8,9,4,9,2,8,7,9,7,3,2,4,5,7,8,2,7,6,1,8];
var result = [];
for (var i=0; (i+5)<arr.length; i=i+5) {
var average = (arr[i] + arr[i+1] + arr[i+2] + arr[i+3] + arr[i+4]) / 5;
result.push(average);
}
document.body.innerHTML = '<pre>' + JSON.stringify(result, null, 4) + '</pre>';
做同样事情的更高级的方法
var result = arr.map(function(x,i) {
return i%5===0 ? arr.slice(i, i+5).reduce(function(a,b) {return a+b}) / 5 : NaN;
}).filter(isFinite);
使用array.slice
:
for (var i = 0; i < Math.floor(arr.length/5); i++) {
f(arr.slice(i*5, i*5+5))
}
下面使用 reduce 和切片对数组中的一系列值求和。
function averageRange(arr, start, end) {
return (function(range) {
return range.reduce(
function(total, val) {
return total + val;
}, 0) / range.length;
}([].slice.apply(arr, [].slice.call(arguments, 1))))
}
function averageEveryN(arr, n) {
return arr.map(function(_, index, arr) {
return index % n === 0 ? averageRange(arr, index, index + count) : NaN;
}).filter(isFinite).slice(0, Math.floor(arr.length / n));
}
function println(text) {
document.getElementsByTagName('body')[0].innerHTML += text + '<br />';
}
var arr = [2, 7, 3, 8, 9, 4, 9, 2, 8, 7, 9, 7, 3, 2, 4, 5, 7, 8, 2, 7, 6, 1, 8];
var count = 5;
averageEveryN(arr, count).map(function(value, index) {
println((index + 1) + '.) ' + value.toFixed(4));
});
输出
1.) 5.8000
2.) 6.0000
3.) 5.0000
4.) 5.8000