我已经实现了三个不同的功能来查找列表中的唯一项目,以便比较结果速度。
速度测试都是成功的,但奇怪的是,方法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
答案 0 :(得分:0)
确定项目[N-2]与[N-1]不同后,您应该将它们都添加到结果中;相反,你只需要添加[N-2]。
在这种情况下,9
是最后一个元素,因为排序是基于字符串值完成的,所以'9' > '11'
就是这样。
也就是说,为了使代码更容易一些,您应该遵循以下算法:
所以:
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;
}
另请注意,传递的数组已按顺序排序;如果这是一个问题,您可能希望先制作一份浅色副本。