2012-03-20 84 views
1

我有一个被称为玩家的对象数组,经常排序(所以某个玩家的索引每轮都会改变)。两位选手完成比赛后,我想用新的比分更新他们的对象。我能想到的唯一办法做到这一点(我是新来的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没有办法做到这一点,我猜我必须学习它。

回答

2

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

有多少玩家?你知道这个循环会减慢你的应用吗? for循环非常常见,而且这个循环肯定不是计算密集型的。

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

+0

这可能是最好的答案。不幸的是,它并没有帮助学习Javascript,但嘿,它仍然很好。 – SomeKittens 2012-03-20 22:44:58

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

一种方法是延长Player对象自己。

例如,如果球员被定义为:

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

您可以用prototype属性扩展。

Player.prototype.index = 0; 

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

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