迭代多次遍历数组并删除元素的最快方式

5
想象一下我有一个数字数组,如下所示:
var myArray = [1、2、3、4、5];
这只是一个简化版本,实际情况要复杂得多(60K或更多项)。
基本上,我需要完全遍历数组以处理其中的某些数字,然后继续完全遍历数组,直到所有数字都被处理(比如我可以在第一次迭代中处理1和3,在第二次迭代中处理2,4和5)编辑:它们不必按顺序排列。
我想知道的是 - 我需要确保之前迭代中已经处理过的项目不会再次被考虑
我的问题是:最快的方法是什么?每一毫秒都很重要,因为这是大规模进行的。
我尝试通过myArray = myArray.splice(i, 1)删除已处理的项目,但速度非常慢。我还尝试将已处理的项目设置为null,然后在随后的迭代中忽略null项目。该方法似乎更快,但仍需要一两秒钟。是否有更快的方法?

1
展示更多的处理过程。很有可能那里也存在瓶颈。 - charlietfl
1
@abagshaw,这很可能是您性能问题的根源。请展示一些代码。 - charlietfl
1
创建一个哈希表对象会无限快。 - charlietfl
1
我会从剩余的颜色中选择第一种颜色,然后在遍历整个数组时寻找与起始颜色相似的颜色。是否无法一次性创建所有组? - Robby Cornelissen
1
如果您能提供用于确定颜色是否接近与第一个比较的颜色的算法,我们可能可以帮助您改进整个处理过程。否则,对于大小接近100K的数组,将null放入其中可能是最快的方法。 - trincot
显示剩余17条评论
2个回答

0

你可以简单地存储上一次处理运行时所得到的索引。毕竟,你不想多次迭代数组,而是想在多个步骤中仅迭代一次。

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);


不幸的是,那样行不通,因为我并不一定按顺序处理。我想我在我的答案中没有表述清楚。我可能会先处理开头的一个项目和结尾的一个项目——它们不必彼此相邻。 - abagshaw
是的,你真的需要修改你的问题,并向我们展示你目前正在做什么以及你需要什么(例如,是什么决定了处理顺序)。如果只是从开头或结尾取出,你可以使用两个索引,但这听起来像是其他问题。 - Bergi

-2
<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>

你能解释一下这与问题有什么关系吗? - Bergi
当没有异步操作时,为什么要使用延迟对象(deferreds)? - Bergi
@Bergi,你说得对。我想展示一个在颜色集合的分区上进行多个异步操作的演示,但是我根本没有将这些操作设置为异步。谢谢! - Bob Dust

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接