查找函数或循环中的

Lookup function or for in loop?

本文关键字:循环 函数 查找      更新时间:2023-09-26

使用查找函数在数组中查找具有特定ID的对象,还是仅使用数组中有孔的for in loop,哪一个对性能更好?

在我的情况下,我的球员阵列是动态的。假设3个玩家连接在一起,所以我的阵列看起来像这样:

players = [player1, player2, player3]

将数组密钥作为玩家ID很容易,这样我就知道ID为2的玩家在玩家数组中排名第三,为了访问他,我只需要使用:players[2],但当第二个玩家离开时,他会创建一个数组洞:

players = [player1,,player3]

据我所知,这个洞会降低使用数组的性能,因为我经常在循环中使用,所以有一个玩家对象的数组,而不是留下数组洞,我只是把洞拼接出来会更好吗?但通过这种方式,我将无法将数组键作为玩家ID,所以我必须使用ID查找功能。那么,最终这两种选择中哪一种对性能更好呢?或者还有更好的方法来解决这个问题?

谢谢!

在我看来,@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];

使用

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

此外,您永远不应该在数组的循环中使用我们。使用forEach或基本的for循环。为什么使用";对于在";数组迭代是个坏主意吗

您可以使用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中的字符串是如何匹配的。