最快的方式通过数组多次迭代,同时删除项目
Fastest way to iterate through array multiple times while removing items
假设我有一个数字数组,如下所示:
var myArray = [1, 2, 3, 4, 5]
;
这是一个简化,我的实际情况场景要大得多(60K或更多项)。
基本上,我需要完全遍历数组以处理一些数字,然后继续遍历数组,直到所有数字都被处理完(假设我可以在第一次迭代中处理1和3,在第二次迭代中处理2、4和5)。编辑:它们不必按顺序排列。
我想知道的是-我需要使在以前的迭代中已经处理的项不再被考虑。
我的问题是:最快的方法是什么?每毫秒都很重要,因为这是在大规模进行的。
我已经尝试删除已通过做myArray = myArray.splice(i, 1)
处理的项目,但这是非常缓慢的。我还尝试将处理过的项目设置为null
,然后在随后的迭代中忽略null
项目。这种方法似乎更快,但仍然需要一两秒钟。有更快的方法吗?
您可以简单地存储在前一次处理运行中获得的索引。毕竟,不希望多次迭代数组,您只希望迭代一次,但要分多个步骤。
function process(arr, step, start) {
var take = Math.min(arr.length - start, Math.round(1 + Math.random() * 3));
for (var i = start; i < start + take; i++) {
console.log("processing item " + arr[i] + " in step " + step);
}
return take;
}
var arr = [1, 2, 3, 4, 5]
for (var step = 0, i = 0; i < arr.length; step++)
i += process(arr, step, i);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
getColorGroup();
});
function getColorGroup()
{
var colors = ['#FAEBD7', '#00FFFF', '#000000', '#0000FF', '#8A2BE2', '#A52A2A', '#DEB887', '#5F9EA0', '#7FFF00', '#D2691E', '#FF7F50', '#6495ED', '#DC143C', '#00FFFF', '#00008B', '#008B8B', '#B8860B', '#A9A9A9', '#A9A9A9', '#006400', '#BDB76B', '#8B008B', '#556B2F', '#FF8C00', '#9932CC', '#8B0000', '#E9967A', '#8FBC8F', '#483D8B', '#2F4F4F', '#2F4F4F', '#00CED1', '#9400D3', '#FF1493', '#00BFFF', '#696969', '#696969', '#1E90FF', '#B22222', '#228B22', '#FF00FF', '#DCDCDC', '#FFD700', '#DAA520', '#808080', '#808080', '#008000', '#ADFF2F', '#FF69B4', '#CD5C5C', '#4B0082', '#F0E68C', '#E6E6FA', '#7CFC00', '#00FF00', '#32CD32', '#FF00FF', '#800000', '#66CDAA', '#0000CD', '#BA55D3', '#9370DB', '#3CB371', '#7B68EE', '#00FA9A', '#48D1CC', '#C71585', '#191970', '#FFE4E1', '#FFE4B5', '#FFDEAD', '#000080', '#808000', '#6B8E23', '#FFA500', '#FF4500', '#DA70D6', '#EEE8AA', '#98FB98', '#AFEEEE', '#DB7093', '#FFDAB9', '#CD853F', '#FFC0CB', '#DDA0DD', '#B0E0E6', '#800080', '#663399', '#FF0000', '#BC8F8F', '#4169E1', '#8B4513', '#FA8072', '#F4A460', '#2E8B57', '#A0522D', '#C0C0C0', '#87CEEB', '#6A5ACD', '#708090', '#708090', '#00FF7F', '#4682B4', '#D2B48C', '#008080', '#D8BFD8', '#FF6347', '#40E0D0', '#EE82EE', '#F5DEB3', '#FFFF00', '#9ACD32'];
var randomIndex = Math.floor(Math.random() * 1000 % colors.length);
var color = colors[randomIndex];
console.log(color);
var tasks = [];
for (var i = 0; i < colors.length; i += 10)
{
tasks.push(findColor(color, colors, i, 10));
}
var group = [];
$.when.apply($, tasks).done(function () {
for(var j = 0; j < arguments.length; j++)
{
group = group.concat(arguments[j]);
}
console.log(group);
});
}
function findColor(sample, colors, startIndex, segmentSize)
{
return $.Deferred(function (deferred) {
setTimeout(function(){
var result = [];
var pattern = /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/i;
var sampleMatch = pattern.exec(sample);
if (sampleMatch) {
for (var i = startIndex; i < startIndex + segmentSize && i < colors.length; i++) {
var match = pattern.exec(colors[i]);
if (match) {
if (sampleMatch[1].toUpperCase() == match[1].toUpperCase()
||
sampleMatch[2].toUpperCase() == match[2].toUpperCase()
||
sampleMatch[3].toUpperCase() == match[3].toUpperCase()) {
result.push(colors[i]);
}
}
}
}
deferred.resolve(result);
}, 0);
}).promise();
}
</script>
相关文章:
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- Javascript - 从对象迭代和删除
- 如何通过迭代对象数组来删除某些项目
- 为什么我的jQuery .每次迭代都无法使用每个项目的属性
- 使用节点在 JSON 数组中搜索项目(最好不迭代)
- "搜索并销毁“;迭代不会'不要一次删除所有项目
- 使用for.of迭代时删除集合中的元素是否安全
- AngularJS Ng-Repeat不迭代$Scope中的项目
- 如何在角度UI树中获取某个项目的键值或迭代
- ES6:在设置/映射迭代期间从集合/映射中删除元素是否危险
- 如何使用 Javascript 将迭代器索引号附加到数组中的每个项目
- 在 6 次迭代的步长中每三个项目更改一次
- Javascript到Jquery的转换,每次迭代都会删除第一个孩子
- AngularJs:错误:用于配对项目的自定义筛选器引发错误:“达到 10 次 $digest() 迭代.流产!
- 循环(将项目存储在集合中)似乎迭代的次数比它应该的次数少
- 在 Angular 项目中迭代 JSON 响应以创建新的 $scope obj 我可以在应用程序中使用的
- 在数组上迭代时删除对象
- 最快的方式通过数组多次迭代,同时删除项目
- 画布游戏-存储/计算位置/迭代粒子/项目符号/游戏元素的最有效方法
- 从数组中删除项目而不迭代