在列表中找到唯一项的这些函数中,为什么其中一个不返回9?

时间:2014-07-22 01:10:15

标签: javascript

我已经实现了三个不同的功能来查找列表中的唯一项目,以便比较结果速度。

速度测试都是成功的,但奇怪的是,方法3不包括原始列表项目列表中的数字9。 为什么不呢?

可以肯定地说,因为该列表由1和1之间的10,000个随机数字串组成。 11,所有数字将始终存在,因此测试结果一致。

生成列表:

var ls = [];
for (var i = 0; i <= 10000; i++) {

    ls.push((Math.round((Math.random() * 10) + 1)).toString());

}

第一种方法:

var uniques = function uniques(list) {

    for (var uniqls = [],
    it = -1,
    length = list.length,
    fi = uniques.findindex;

    ++it < length;

    (fi(list, list[it]) - it) || uniqls.push(list[it]));

    return uniqls;
};

Object.defineProperty(uniques, 'findindex', {

    'configurable': true,
        'enumerable': true,
        'writable': true,
        'value': function (ls, node) {

        for (var it = -1, length = ls.length;
        (++it < length) && (node !== ls[it]););
        return (length - it) ? it : -1;

    }
});

第三种方法:

function sortUnique(ls) {

    var sorted_arr = ls.sort();
    var results = [];
    for (var i = 0; i < ls.length - 1; i++) {

        if (sorted_arr[i + 1] !== sorted_arr[i]) {

            results.push(sorted_arr[i]);

        }

    }

    return results;
}

测试&amp;时间:

console.time("M1 loop");

console.log("M1 Unique" + uniques(ls));

console.timeEnd("M1 loop");

console.time("M3 loop");

console.log("M3 Unique" + (sortUnique(ls)));

console.timeEnd("M3 loop"); 

结果:

M1 Unique 6,3,2,10,8,7,5,9,4,11,1
M1 loop: 4.000ms

M3 Unique 1,10,11,2,3,4,5,6,7,8
M3 loop: 9.000ms

1 个答案:

答案 0 :(得分:0)

确定项目[N-2]与[N-1]不同后,您应该将它们都添加到结果中;相反,你只需要添加[N-2]。

在这种情况下,9是最后一个元素,因为排序是基于字符串值完成的,所以'9' > '11'就是这样。

也就是说,为了使代码更容易一些,您应该遵循以下算法:

  1. 始终添加第一个元素(除非数组为空)
  2. 添加后续元素(如果它们与其前任
  3. 不同)

    所以:

    function sortUnique(ls) 
    {
        var results = [];
    
        if (!ls.length) {
            return results; 
        }
    
        ls.sort();
        results.push(ls[0]);
    
        for (var i = 1; i < ls.length; i++) {
            if (ls[i - 1] !== ls[i]) {
                results.push(ls[i]);
            }
        }
    
        return results;
    }
    

    另请注意,传递的数组已按顺序排序;如果这是一个问题,您可能希望先制作一份浅色副本。