从数组中删除的最有效方法
Most efficient way to delete from array?
我有一个包含HTML5游戏中粒子(火,血,烟等(的数组。所有粒子都有有效期/寿命。我以 60fps 的速度每帧创建多达 100 个粒子,所以我想让这个数组尽可能干净,这样我就可以有效地循环播放它。
我听说最好使用"拼接"而不是"删除"从数组中删除元素。这对我来说很有意义,因为我宁愿不循环遍历数组的空白键("删除"留下(。
但是,我对此进行了测试,如果我"删除"键而不是拼接它们以删除过期的粒子,则具有更高,更一致的帧速率。缺点是游戏运行的时间越长,我的粒子数组就越长。
有没有更好的解决方案?
如果数组中项目的顺序无关紧要,则只需将数组中的最后一个项目分配给要覆盖的项目,然后通过减少.length
将其删除。
function unordered_remove(arr, i) {
if (i <= 0 || i >= arr.length) {
return;
}
if (i < arr.length - 1) {
arr[i] = arr[arr.length-1];
}
arr.length -= 1;
}
这要快得多,因为它不需要重新索引,并且适用于顺序无关紧要的情况。
当您在数组元素上使用 delete
时,您实际要做的就是将该数组元素设置为 undefined
。 数组仍将具有相同的长度。 当你使用splice
时,你实际上完全删除了该元素。 该元素被删除,该元素之后的所有内容将向下移动 1 个索引。在这两者中,delete
会更快,因为您的数组不必重新索引。
至于性能,如果将删除的元素保留为undefined
有效,那么这可能是最好的方法。 如果您担心数组长度过长,或者可能必须频繁搜索该数组并希望减少开销,则可以定期filter
出未定义的元素,如下所示:
function filterArr() {
myArr = myArr.filter(function(v) {
return typeof v !== 'undefined';
});
}
var interval = setInterval(filterArr, 5000);
这将为您提供两全其美的效果。 当您需要删除粒子时,您可以使用delete
将元素设置为 undefined,这比就地删除它们更快。 时不时地将它们删除以保持较低的阵列大小。
您可以根据自己的要求对其进行改进。 祝你好运:)
通过自己打包数组,您将获得更高的性能:更少的操作,无需处理当前数组并创建一个新数组(如 Array.filter 所做的(,因此垃圾收集更少。
function packArray(tgtArray) {
if (!tgtArray || !tgtArray.length) return;
var srcIndex = 0;
var dstIndex = 0;
var arrayLength = tgtArray.length ;
do {
var currentItem = tgtArray[srcIndex];
if (currentItem.alive) {
if (srcIndex != dstIndex) {
tgtArray[dstIndex] = currentItem ;
}
dstIndex++;
}
srcIndex++;
} while (srcIndex != arrayLength) ;
dstIndex--;
tgtArray.length = dstIndex > 0 ? dstIndex : 0 ;
}
- 在jQuery中创建向下滑动子菜单的最有效方法
- 使用Underscore.js修改json数组中所选元素的更有效方法
- 选择具有值数组的所有元素的最有效方法
- 将JSON存储和恢复到此Ionic应用程序的最有效方法
- 将javascript数组中的项移动到特定位置的有效方法
- 将JS对象数组转换为嵌套形式的最有效方法
- 隐藏具有特定类$.each、for等的元素的有效方法
- 什么's是调用具有可变参数的函数的有效方法
- 选择具有特定数据的所有 html 标记的最有效方法是什么 - [适当性],无论值如何
- 使用 jQuery 调用 PHP 端点的最有效方法
- 这是解析 Int 的有效方法吗?
- 在JavaScript中搜索数组映射的最有效方法
- 获取字符串中最后一个换行符的最有效方法是什么
- 什么's是在两个(或多个)阵列中找到匹配的细胞序列的最有效方法
- 什么's是在IE8+中添加元素的最有效方法
- 从任何jquery选择器字符串创建元素的最有效方法
- 在日期范围内查找丢失日期的最有效方法是什么
- 对区间[1,10^12]中的整数进行编码/解码的快速有效方法是什么
- 在条件(if)结构的条件语句中是否有定义变量的有效方法
- 在ASP.NET中使用JQuery UI自动完成的有效方法