我有一个被称为玩家的对象数组,它经常被排序(因此某个玩家的索引每一轮都会改变)。两名玩家完成游戏后,我想用新的分数更新他们的对象。我能想到的唯一方法(我是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)访问时间,是否有一些函数可以用来减少这个顺序(或许甚至完全不需要这个函数)?
有用信息:
答案 0 :(得分:2)
如果这些是对象,为什么不保留另一个数组,其中键是名称 一个用于排序等的数组 一个用于快速访问的阵列。
答案 1 :(得分:2)
除非它确实存在问题,否则我会保持原样。这听起来真的是过早的优化。
有多少名球员?你知道这个循环正在减慢你的应用程序吗? for循环是很常见的,这个肯定不是计算密集型的。
您确实可以使用单独的数据结构进行簿记和快速访问,但只有在真正需要时才应该这样做。原因是它需要努力使数据结构保持同步,事情可能会出错,等等。
答案 2 :(得分:2)
将您的播放器存储为对象而不是阵列。然后您可以按名称(或其他一些唯一键)访问玩家:
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属性,表示数组中的位置。
还有其他方法我可以想到做这样的事情,但这是我的头脑。