Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找函数还是用于循环中?_Javascript_Arrays_Performance - Fatal编程技术网

Javascript 查找函数还是用于循环中?

Javascript 查找函数还是用于循环中?,javascript,arrays,performance,Javascript,Arrays,Performance,哪一种性能更好?使用查找函数查找具有特定ID的数组中的对象,还是仅使用带有数组中孔的for-in-loop 在我的情况下,我有一个动态的玩家阵列。假设连接了3个玩家,因此我的阵列如下所示: players = [player1, player2, player3] 将阵列键保留为玩家ID很容易,因此我知道ID为2的玩家是玩家阵列中的第三个玩家,为了访问他,我只需要使用:players[2],但当第二个玩家离开时,他会创建一个阵列孔: players = [player1,,player3]

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

在我的情况下,我有一个动态的玩家阵列。假设连接了3个玩家,因此我的阵列如下所示:

players = [player1, player2, player3]
将阵列键保留为玩家ID很容易,因此我知道ID为2的玩家是玩家阵列中的第三个玩家,为了访问他,我只需要使用:
players[2]
,但当第二个玩家离开时,他会创建一个阵列孔:

players = [player1,,player3]
据我所知,这个洞会降低使用数组的性能,因为我经常使用for in-loop,那么使用一个玩家对象数组,而不是留下数组洞,我只是将这个洞拼接出来会更好吗?但这样我就不能将数组键保留为播放器ID,所以我必须使用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


此外,您永远不应该在阵列上使用我们的for-in-loop。使用forEach或basic for循环

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

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

对于2个(或200或2000个)元素的数组,这并不重要。为什么不使用javascript对象{},其中属性键是玩家ID的“程序员浪费大量时间考虑或担心其程序中非关键部分的速度,而在考虑调试和维护时,这些提高效率的尝试实际上会产生强烈的负面影响。我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源。然而,我们不应该在这关键的3%中放弃我们的机会“Donald KnuthI认为这是一个好问题。因为这不仅仅关乎性能。你迟早要做一次清理,如果像这样实现的话,删除所有的洞并重新分配ID,否则数组会变得太大。内存泄漏?这是怎么回事?如果他不断添加和删除玩家,阵列就会变得非常稀疏。这不是内存泄漏(就像
window.foo='bar';
不是内存泄漏一样)。JS中不能有内存泄漏(除非实现中有bug)。你所指的只是一种低效的内存使用。在现实生活中提到“将变得越来越慢”是可以忽略不计的(除非OP正在做一些疯狂的事情,这是不可能的)。如果游戏有一个主大厅,人们在第二时间进出,那么它就不疯狂了。