var players = [{
blobs: [{
mass: 1
}, {
mass: 3
}]
}, {
blobs: [{
mass: 5
}, {
mass: 3
}]
}];
-> [players[1], players[0]];
答案 0 :(得分:0)
使用.reduce
和.sort
:
const players = [{
blobs: [{
mass: 1
}, {
mass: 3
}]
}, {
blobs: [{
mass: 5
}, {
mass: 3
}]
}, {
blobs: [{
mass: 1
}, {
mass: 1
}]
}];
const sumMasses = players.reduce((massSoFar, player) => {
const thisPlayerMass = player.blobs.reduce((allBlobMassSoFar, { mass }) => allBlobMassSoFar + mass, 0);
return massSoFar + thisPlayerMass;
}, 0);
console.log(sumMasses);
players.sort((playerA, playerB) => {
const playerAMass = playerA.blobs.reduce((allBlobMassSoFar, { mass }) => allBlobMassSoFar + mass, 0);
const playerBMass = playerB.blobs.reduce((allBlobMassSoFar, { mass }) => allBlobMassSoFar + mass, 0);
return playerBMass - playerAMass;
});
console.log(JSON.stringify(players));

但请注意,for
循环 比数组方法更快 - 数组方法的主要目的不是为了更快的代码,而是为了让更具可读性,更抽象< / em>代码。但这些通常比代码速度更重要。
答案 1 :(得分:0)
我想你可以这样做:
var players = {
data: [
{
val1: 3,
val2: 2
}, {
val1: 4,
val2: 5
}
],
totalval1: 7,
totalval2: 2
};
var addScore = function(player, key, score){
players.data[player][key] += score;
players["total" + key] += score;
};
var subScore = function(player, key, score){
players.data[player][key] -= score;
players["total" + key] -= score;
};
这样你就不需要任何循环了,你可以立即获得总数。同样,您可以将每个群体的总数存储在每个玩家的数据中。那么您可以使用该值进行排序而无需任何计算。
注意:它只是一个显示逻辑的伪代码。
答案 2 :(得分:0)
根据数组的本质,以概念上比循环更快的方式获得总和是不可能的。有几种方法可以在不手动使用循环的情况下获得总和,但没有一种方法更快。
你可以使用递归!
function getSumOfMass(arr, i, j) {
var sum = arr[i].blobs[j].mass;
j++;
if(j >= arr[i].blobs.length) {
j = 0;
i++;
}
if(i >= arr.length) return sum;
return sum + getSumOfMass(arr, i, j);
}
这是我可以考虑不使用任何循环的唯一方法。任何其他解决方案在技术上都在后台使用循环。