javascript中的数组的unique()数组

前端之家收集整理的这篇文章主要介绍了javascript中的数组的unique()数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Easiest way to find duplicate values in a JavaScript array47
众所周知,没有内置的功能可以从javascript中的数组中删除重复的内容.我注意到,这也是缺乏jQuery(它只有DOM选择的唯一功能),我发现最常见的代码片段检查整个数组和每个元素的一个子集(不是非常有效率,我认为),像:
for (var i = 0; i < arr.length; i++)
    for (var j = i + 1; j < arr.length; j++)
        if (arr[i] === arr[j])
            //whatever

所以我自己做:

function unique (arr) {
    var hash = {},result = [];
    for (var i = 0; i < arr.length; i++)
        if (!(arr[i] in hash)) { //it works with objects! in FF,at least
            hash[arr[i]] = true;
            result.push(arr[i]);
        }
    return result;
}

我想知道是否有任何其他算法被接受为最好的这种情况(或者如果你看到任何明显的缺陷可以修复),或者你在JavaScript中需要这样做(我知道jQuery不是只有框架和其他一些可能已经覆盖了).

解决方法

使用对象文字就是我会做的.很多人很想念这项技术,而是选择典型的阵列散步作为您显示的原始代码.唯一的优化是避免每次查找arr.length.除此之外,O(n)与您获得的唯一性一样好,并且比原来的O(n ^ 2)示例好得多.
function unique(arr) {
    var hash = {},result = [];
    for ( var i = 0,l = arr.length; i < l; ++i ) {
        if ( !hash.hasOwnProperty(arr[i]) ) { //it works with objects! in FF,at least
            hash[ arr[i] ] = true;
            result.push(arr[i]);
        }
    }
    return result;
}

// * Edited to use hasOwnProperty per comments

时间复杂性总结

f()    | unsorted | sorted | objects | scalar | library
____________________________________________________________
unique   |   O(n)   |  O(n)  |   no    |  yes   |    n/a
original |  O(n^2)  | O(n^2) |   yes   |  yes   |    n/a
uniq     |  O(n^2)  |  O(n)  |   yes   |  yes   | Prototype
_.uniq   |  O(n^2)  |  O(n)  |   yes   |  yes   | Underscore

与大多数算法一样,还有权衡.如果您只排序标量值,则您对原始算法的修改提供最佳解决方案.但是,如果您需要排序非标量值,则使用或模拟所讨论的任一库的uniq方法将是您的最佳选择.

猜你在找的JavaScript相关文章