哪个性能更好 - 有一个查找函数可以在数组中找到一个具有特定ID的对象,或者只是在数组中使用for in循环?
在我的情况下,我有玩家阵列是动态的。让我们说3个玩家已连接,所以我的阵列看起来像这样:
players = [player1, player2, player3]
将数组键保持为玩家ID很容易,所以我知道ID为2的玩家在玩家阵列中排名第3,为了访问他我只需要使用:players[2]
但是作为第2个玩家他创造了一个阵列孔:
players = [player1,,player3]
据我所知,这个洞会降低使用数组的性能,因为我使用for-in循环很多,拥有一个玩家对象数组会更好,而不是留下数组漏洞我只是将孔拼出来?但是这样我就不能将数组键保存为玩家ID,所以我必须使用ID查找功能。那么这两个选择中哪一个更适合性能呢?或者有更好的方法来解决这个问题?
谢谢!
答案 0 :(得分:1)
在我看来,@ Jaromanda X在评论中提到的选项是最好的,因为"洞的实施"将变得越来越慢,尤其是当在玩家阵列上进行迭代时,因为当你不断添加和移除玩家时,箭头会变得非常稀疏,并且主要由漏洞组成。
var players = {};
players[p.id] = p; // add player p
delete players[p.id]; // remove player p
// player ids have to be unique and should be strings
这就是为什么查找不是一个好主意,首先我认为这可能很容易,但实际上这个代码失败了,因为你必须在删除的播放器之后更新所有索引。那么最好去玩家对象。
// ATTENTION: example of FAILING implementation
var players = [];
var map = {};
// add player p
var idx = players.push(p) - 1;
map[p.id] = idx;
// remove player p
players.splice(map[p.id], 1);
delete map[p.id];
答案 1 :(得分:0)
使用
var players = {
abc1: player1,
abc2: player2,
abc3: player3
}
而不是var players = [player1, player2, player3]
现在您可以通过players.abc1.name = "Nicholas"
访问它,无需查找功能。如果您只是使用ID来有条理地查找每个玩家,我建议采用更简单的方法:
var players = {
player1: player1,
player2: player2,
player3: player3
}
通过这种方式,您可以更轻松地访问它,例如players.player1[madeUpPropName] = someValue
;
此外,您永远不应该在数组上使用for-in循环。使用forEach或基本for循环。 Why is using "for...in" with array iteration a bad idea? 强>
答案 2 :(得分:0)
您可以使用console.time(str)
和console.timeEnd(str)
轻松自行检查效果。使用以下示例进行检查:
var array = ['player1', 'player2', 'player3'];
// Test using indexOf
console.time('test1');
var val = array.indexOf('player3');
console.timeEnd('test1');
// Test using a for loop
console.time('test2');
for (var i in array) {
if (i == 'player3') {
break;
}
}
console.timeEnd('test2');
请注意time
和timeEnd
中的字符串是如何匹配的。