编辑Array的元素

时间:2012-03-20 20:07:42

标签: javascript arrays

我有一个被称为玩家的对象数组,它经常被排序(因此某个玩家的索引每一轮都会改变)。两名玩家完成游戏后,我想用新的分数更新他们的对象。我能想到的唯一方法(我是Javascript的新手)是O(n)算法:

function updatePlayer(player){
    for(var i=0;i<players.length;i++)
    {
        if(players[i].name === player.name)
            players[i] = player;
    }
}

我知道数组有O(1)访问时间,是否有一些函数可以用来减少这个顺序(或许甚至完全不需要这个函数)?

有用信息:

  • 我对Javascript很新,所以更好的答案是解释更多/我从中学到的东西。
  • 我还没有玩过jQuery,所以避免这种情况的解决方案更可取。如果没有jQuery没有办法做到这一点,我猜你必须学习它。

4 个答案:

答案 0 :(得分:2)

如果这些是对象,为什么不保留另一个数组,其中键是名称 一个用于排序等的数组 一个用于快速访问的阵列。

答案 1 :(得分:2)

除非它确实存在问题,否则我会保持原样。这听起来真的是过早的优化。

有多少名球员?你知道这个循环正在减慢你的应用程序吗? for循环是很常见的,这个肯定不是计算密集型的。

您确实可以使用单独的数据结构进行簿记和快速访问,但只有在真正需要时才应该这样做。原因是它需要努力使数据结构保持同步,事情可能会出错,等等。

答案 2 :(得分:2)

将您的播放器存储为对象而不是阵列。然后您可以按名称(或其他一些唯一键)访问玩家:

http://jsfiddle.net/RBwgv/

var players = {
    "Player1": {
        "Score": 0,
        "OtherStuff": "test"
    },
    "Player2": {
        "Score": 100,
        "OtherStuff": "test"
    },
    "Player3": {
        "Score": 5,
        "OtherStuff": "test"
    }
};

for (player in players) {
    alert('player ' + player + '\'s score is ' + players[player].Score);
}

答案 3 :(得分:2)

一种方法是自己扩展Player对象。

例如,如果Player被定义为:

function Player(newName) {
   this.name = newName;
}

您可以使用prototype属性扩展它。

Player.prototype.index = 0;

此时,每个Player对象都有一个index属性,表示数组中的位置。

还有其他方法我可以想到做这样的事情,但这是我的头脑。