2

我一直在寻找一个删除数组中重复值的 javascript 函数。我发现了这个功能:

function removeDuplicateElement(arrayName)
{
    var newArray=new Array();
    label:for(var i=0; i<arrayName.length;i++ )
    {   
        for(var j=0; j<newArray.length;j++ )
        {
            if(newArray[j]==arrayName[i]) 
            continue label;
        }
        newArray[newArray.length] = arrayName[i];
    }
    return newArray;
}

这就是我需要的。有人可以解释一下这个功能是如何工作的,以及那个“标签:”是什么吗?我无法理解这段代码的逻辑,如果有人能给我一个解释,那就太好了。10倍

4

4 回答 4

3

在 JavaScript 中,您可以在or语句中将 a指定label:为要跳转到的位置。因此,当达到时,迭代将返回到外部 for 循环,而不是它所在的内部循环(这将是 的默认行为)continuebreakcontinuecontinue

基本上,此函数通过创建一个新数组newArray(不修改旧数组)并遍历原始数组中的每个元素来工作。它将原始数组中的元素添加到newArrayif not already found 中。newArray它通过在旧数组循环的每次迭代中循环它并查找匹配值来确定它是否已经存在arrayName[i]

function removeDuplicateElement(arrayName)
{
    // Declares a new array to hold the deduped values
    var newArray=new Array();
    // Loops over the original array
    // label: here defines a point for the continue statement to target
    label:for(var i=0; i<arrayName.length;i++ )
    {   
        // Loops over the new array to see if the current value from the old array
        // already exists here
        for(var j=0; j<newArray.length;j++ )
        {
            // The new array already has the current loop val from the old array
            if(newArray[j]==arrayName[i]) 
            // So it returns to the outer loop taking no further action 
            // This advances the outer loop to its next iteration
            continue label;
        }
        // Otherwise, the current value is added to the new array
        newArray[newArray.length] = arrayName[i];
    }
    // The new deduped array is returned from the function
    return newArray;
}

有关continue此上下文中的功能的更多信息,请查看 MDN 文档

于 2012-11-22T17:47:21.730 回答
1

该函数遍历现有数组中的所有元素,如果它们不在新数组中,则将它们添加到新数组中。允许内label循环使用continue语句继续循环的下一次迭代,而不是内循环的下一次迭代。常规continue只会重复内部循环,无论如何都会发生这种情况。

于 2012-11-22T17:47:11.320 回答
0

您可以使用 ES5 方法简化一点:

function dumpDupes ( arr ) {
    var arr2 = [];
    arr.forEach(function ( item ) {
        if ( arr2.indexOf( item ) === -1 ) arr2.push( item );
    });
    return arr2;
}
于 2012-11-22T18:03:24.687 回答
0

仅供参考Sizzle 的方法更快:

function dedupe(array) {
    array.sort();
    for(var i = 1; i < array.length; i++) {
        if (array[i-1] == array[i])
            array.splice(i--, 1);
    }

    return array;
}

尽管我实际上是在调整它以查看是否可以在 jsperf.com 上加快它的速度 - 这实际上比任何一个都快:

function dedupeManyDupes(array) {
    array.sort();
    var l = array.length;
    for(var i = 1; i < l; i++) {
        if (array[i-1] == array[i]) {
            var dupe = array[i];
            var mark = i;
            for(i++; i < l && array[i] == dupe; i++)
            {}
            var snip = i - mark;
            array.splice(mark, snip);
            i -= snip;
            l -= snip;
        }
    }
    return array;
}

http://jsperf.com/js-dedupe-small
http://jsperf.com/js-dedupe-large
http://jsperf.com/js-dedupe-many-dupes

http://jsfiddle.net/b9chris/fLBTv/

于 2013-03-27T06:42:43.353 回答