【问题标题】:Remove element in nested loop删除嵌套循环中的元素
【发布时间】:2014-05-03 17:08:40
【问题描述】:

我正在用 JS 编写一个简单的元球实现。我有一组元球,我每帧都遍历所有元球,对于每个元球,我检查与其他元球的距离,如果它们足够近,我需要合并它们。

这就是我猜它的样子,但我不知道如何正确地从数组中删除元素而不破坏循环。

for(var i = 0; i < points.length; i++) {
    for(var j = 0; j < points.length ; j++) {
        if(i != j) {
            if(distance < 10) {
                //remove one of the points using splice
            }
        }
    }
}

感谢您的帮助。

【问题讨论】:

  • 那么,points 是什么?它是“实时”集合还是静态集合?如果在迭代时从集合中删除项目是一个问题,您始终可以将要删除的项目存储在 toDelete 集合中,然后遍历该集合以在以后删除它们。
  • 很有可能这是一个 O(n^3) 算法,因为各种删除函数的时间可能很糟糕。我说“可能”是因为 JS 数组的内部表示在规范中并不清楚。

标签: javascript arrays loops splice


【解决方案1】:

首先,在i + 1 开始您的内部循环。您已经比较了直到 i 的元素,所以无需重复,对吧?这样您也可以摆脱 if 声明。

然后,拼接时,将j递减,以免跳过下一个元素。

for(var i = 0; i < points.length; i++) {
    for(var j = i + 1; j < points.length ; j++) {
        if (distance(i, j) < 10) {
            points.splice(j--, 1);
        }
    }
}

【讨论】:

  • @user2715488 - 注意splice() 总是返回一个数组。如果您想使用已删除的元素(如您需要执行合并逻辑所建议的那样),您可能需要执行 point = points.splice(j--, 1)[0]; 来获取它。
  • 感谢您的回答,这似乎是一个不错的优化,但在我的情况下,当元球彼此靠近(但不够靠近以合并)时,我需要它们靠得更近。通过这些循环,一对中只有一个移动到另一个。编辑:没关系,我累了,并没有真正考虑过,它可以工作,但需要更多代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多