添加对象的属性

时间:2018-03-30 07:25:50

标签: javascript

我有一个阵列。它包含对象。对象包含一个blob数组(它们是对象)。每个斑点都有质量。我想找到质量的总和,并按降序返回一个包含所有玩家的数组。 (我正试图为我的游戏制作排行榜' _')。

var players = [{
  blobs: [{
    mass: 1
  }, {
    mass: 3
  }]
}, {
  blobs: [{
    mass: 5
  }, {
    mass: 3
  }]
}];
-> [players[1], players[0]];

3 个答案:

答案 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);
}

这是我可以考虑不使用任何循环的唯一方法。任何其他解决方案在技术上都在后台使用循环。