JavaScript数组中最大的6个数字之和

4

我有一个大约有10个值的数组,想知道是否有JS或JQuery的方法可以将最高的6个值相加并得到总和。

4个回答

8

这里:

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()方法。)


注意:排序会破坏原始数组。我不知道在这种情况下是否有问题。可以通过添加.slice(0)来复制数组以避免此问题。 - some
@some Sort 不会破坏数组本身。Sort 会“破坏”数组元素的顺序。数组对象本身是被保留的。因此,在排序后,对数组的引用仍然有效。 - Šime Vidas
@ŠimeVidas 我在选择措辞方面犯了一个错误(英语不是我的母语)。它重新排列顺序(就像我在对另一个答案的评论中所说的那样)。事实是,如果arr [0]是“星期一的访客数量”,则在排序后它不再是(除非星期一的访客最少)。由于原始数组是否被修改不明显,并且可能导致难以找到的错误,因此,如果我不是在函数内部创建排序后的数组,我总是复制数组。 - some
Firebug显示以下错误 Uncaught SyntaxError:意外的令牌ILLEGAL 在第11行,即document.write行。 - user1599318
1
@user1599318,你遇到这个问题是因为你的数组不包含数字,而是表示数字的字符串。(100+100=200,但是'100'+'100'='100100') 你必须先将这些字符串值强制转换为Number类型。我在上面的答案中添加了一个.map()调用来处理这个问题。 - Šime Vidas
显示剩余11条评论

5

更简单易懂的方法是:

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);

1
我喜欢@Šime Vidas提出的解决方案,但并不是每次都要写漂亮的代码。你的代码也可以,所以+1。 - gion_13
1
注意:sort会重新排列原始数组。我不知道在这种情况下是否有问题,但是可以通过在arr和sort之间添加.slice(0)来轻松避免。 - some

1
var sortedArr = arr.sort(function (a,b) { return b - a; });
var sum = 0;
for (var i = 0; i < 6; i++)
    sum += sortedArr[i];

1

答案已编辑,以避免由@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);​

JS Fiddle演示

然而,对于那些可用的浏览器,reduce()要简单得多。


我不确定用结果覆盖函数是否是一个很好的想法。 - pimvdb
@pimvdb:好的,这可能是自学成为问题的时候之一;我有点羞于承认我不理解你的评论... =/ - David Thomas
@DavidThomas 你给函数命名为sum,然后写成sum = sum(...)。这在评估环境(如Firefox控制台)中可以工作,但在实际代码中不起作用。 - some
@some:啊!所以,将变量命名为与函数相同的名称是(主要)问题? - David Thomas
是的,这就是pimvdb所评论的内容。 - some
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接