查找功能还是循环?

时间:2016-08-05 01:10:13

标签: javascript arrays performance

哪个性能更好 - 有一个查找函数可以在数组中找到一个具有特定ID的对象,或者只是在数组中使用for in循环?

在我的情况下,我有玩家阵列是动态的。让我们说3个玩家已连接,所以我的阵列看起来像这样:

players = [player1, player2, player3]

将数组键保持为玩家ID很容易,所以我知道ID为2的玩家在玩家阵列中排名第3,为了访问他我只需要使用:players[2]但是作为第2个玩家他创造了一个阵列孔:

players = [player1,,player3]

据我所知,这个洞会降低使用数组的性能,因为我使用for-in循环很多,拥有一个玩家对象数组会更好,而不是留下数组漏洞我只是将孔拼出来?但是这样我就不能将数组键保存为玩家ID,所以我必须使用ID查找功能。那么这两个选择中哪一个更适合性能呢?或者有更好的方法来解决这个问题?

谢谢!

3 个答案:

答案 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');

请注意timetimeEnd中的字符串是如何匹配的。