我有一个大约有10个值的数组,想知道是否有JS或JQuery的方法可以将最高的6个值相加并得到总和。
我有一个大约有10个值的数组,想知道是否有JS或JQuery的方法可以将最高的6个值相加并得到总和。
这里:
var top6Total = arr
.map(function (v) { return +v; })
.sort(function (a,b) { return a-b; })
.slice( -6 )
.reduce(function (a,b) { return a+b; });
在线演示: http://jsfiddle.net/bPwYB/
(注意: 对于IE8,您需要使用polyfill来支持.reduce()
方法。)
更简单易懂的方法是:
var arr = [1,2,3,4,5,6,7,8,9,10]; // your array
arr = arr.sort(function (a,b) { return a - b; });
var sum=0;
for(var i=0;i<6;i++) {
sum+=arr[i];
}
alert(sum);
var sortedArr = arr.sort(function (a,b) { return b - a; });
var sum = 0;
for (var i = 0; i < 6; i++)
sum += sortedArr[i];
答案已编辑,以避免由@pimvdb识别并由@some(在下面的评论中)友好解释的“用结果覆盖函数”的问题。
一个简单的方法,应该可以涵盖几乎所有浏览器(我认为),就是使用一个函数来求和数组值:
var vals = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
function arraySum(arr) {
if (!arr) {
return false;
}
else {
var sum = 0;
for (var i = 0, len = arr.length; i < len; i++) {
sum += arr[i];
}
return sum;
}
}
sum = arraySum(vals.sort(function(a, b) {
return b - a;
}).slice(0, 6));
console.log(sum);
然而,对于那些可用的浏览器,reduce()
要简单得多。
sum = sum(...)
。这在评估环境(如Firefox控制台)中可以工作,但在实际代码中不起作用。 - some
.slice(0)
来复制数组以避免此问题。 - somearr [0]
是“星期一的访客数量”,则在排序后它不再是(除非星期一的访客最少)。由于原始数组是否被修改不明显,并且可能导致难以找到的错误,因此,如果我不是在函数内部创建排序后的数组,我总是复制数组。 - some100+100=200
,但是'100'+'100'='100100'
) 你必须先将这些字符串值强制转换为Number类型。我在上面的答案中添加了一个.map()
调用来处理这个问题。 - Šime Vidas