在JavaScript中为所有对象设置属性的简单语法

时间:2015-06-30 21:41:24

标签: javascript

我正在编写一个简单的JavaScript游戏,该游戏使用一个对象代表一组具有当前游戏以及之前游戏的分数和其他值的团队。该对象看起来像这样:

var leaderboard = [
    {team:"Black", captain:"Sparrow", score: 100, treasureFound: 500, totalTreasure: 5000, wins: 2},
    {team:"Blue", captain:"Smollett", score: 5, treasureFound: 0, totalTreasure: 200,  wins: 1},
    {team:"Green", captain:"Hook", score: 10000, treasureFound: 4500, totalTreasure: 25000,  wins: 10}
];

我想要做的是在每次游戏后重置得分值,同时保持会话的运行总值。一种方法是使用循环,但是我想知道是否有更简洁的方法来执行此操作而不显式循环每个团队将所有分数设置为相同的值0。 有什么想法吗?

这里有一个小提琴:http://jsfiddle.net/2gbgkLg3/1/

编辑:引用原始问题文本寻找非迭代语法,但我认为这让我感到困惑和分心,所以我改变了它。

1 个答案:

答案 0 :(得分:1)

您可以使用forEach(将遍历原始数组)

leaderboard.forEach(function(record) {
  record.score = 0;
  record.treasureFound = 0;
  record.totalTreasure = 0;
});

您可以使用地图功能(将创建新数组)

leaderboard = leaderboard.map(function(record) {
  record.score = 0;
  record.treasureFound = 0;
  record.totalTreasure = 0;
  return record;
});

所以是的,这两个都是迭代的。但是你正在处理一系列数据,所以可能是一个可变数量的记录。没有其他方法可以做到这一点。

如果你知道你总会有3支队伍,你可以这样做

leaderboard[0].score = 0;
leaderboard[0].treasureFound = 0;
leaderboard[1].score = 0;
leaderboard[1].treasureFound = 0;
leaderboard[2].score = 0;
leaderboard[2].treasureFound = 0;

但是一旦你有超过3支球队,你的排行榜就会中断 - 第4支球队的统计数据不会被重置。

当使用简单的循环时,它的代码更多,看起来很愚蠢。

最后一个选择是使用类似jQuery的$.extend来执行深度合并。

$.extend(true, leaderboard, [
  {score: 0, treasureFound: 0},
  {score: 0, treasureFound: 0},
  {score: 0, treasureFound: 0}
]);

但是,只要您在排行榜上拥有多于或少于3个团队条目,这将再次失败。