注意:过滤数组中的未定义元素
英语很弱,可能被描述为不准确。 >﹏<
谢谢
function delRepeatArray1(arr) {
console.time();
var result = Array.from(new Set(arr));
console.timeEnd();
return result;
}
function delRepeatArray2(arr) {
console.time();
var result = arr.filter(function (em, index, arr) {
return arr.indexOf(em) === index;
});
console.timeEnd();
return result;
}
var arr = ["undefined", "200", 0, -0, 200, undefined, undefined, null, true, null, "true", false, 0, true, 200, false],
result1 = delRepeatArray1(arr),
result2 = delRepeatArray2(arr);
console.log(result1);
console.log(result2);
以下是从提供的数组中获取唯一值的快速代码段:
var arr = ["undefined", "200", 0, -0, 200, undefined, undefined, null, true, null, "true", false, 0, true, 200, false];
var uniqueNames = [];
$.each(arr, function(i, el){
if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el);
});
console.log(uniqueNames);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
我们不能简单地把它变成一套吗?
var arr = ["undefined", "200", 0, -0, 200, undefined, undefined, null, true, null, "true", false, 0, true, 200, false];
var filteredarr = arr.filter(Boolean); //filter undefined
var set = new Set(filteredarr); //remove duplicates
console.log(set);
我发现了一个benchmark比较了几种方法。在我的系统上最快的方法是一个简单而简单的循环。
function unique(arr) {
let out = [];
const len = arr.length;
for (let i = 0; i != len; ++i) {
const obj = arr[i];
if (out.indexOf(obj) == -1) out.push(obj);
}
return out;
}
虽然,基准测试显示使用reduce
在其他系统上更快。
function unique(arr) {
return arr.reduce((out, obj) => {
if (out.indexOf(obj) == -1) out.push(obj);
return out;
}, []);
}
最快的方法是使用Set
过滤掉重复项。在您的小阵列上没有任何区别,要对您的代码进行基准测试,您应该尝试更大的阵列(例如,至少65k元素)。然后你会看到常规循环(你的delRepeatArray2
)它比Set
要慢很多,它基本上会保持与较小的一组项目相同的时间。
说,我们还在谈论几毫秒。
如果你想过滤掉undefined
,你最好在减少到唯一值之后这样做,所以你在Set中只有一个undefined
,并且可以很容易地删除:
var set = new Set(arr);
set.delete(undefined);
return Array.from(set);