牛客网有一道题
要求去除输入数组的重复项,有bool undefined null NaN number object string 几乎所有数据类型
但是去重的时候,不要求去除object "{}" 这个考点有两个 一个indexOf 和 NaN!==NaN
这种去重,有三种解决方案
使用indexOf
原代码
Array.prototype.check =
function(){
var res =
[];
var flag =
true;
for(
var i=0;i<
this.length;i++
){
if (res.indexOf(
this[i])== -1
) {
if (
this[i]!=
this[i]
) {
if (flag===
true) {
res.push(this[i]);
flag=
false;
}
}else{
res.push(this[i]);
}
}
return res;
}
测试代码
var arr = [
false,
true, undefined,
null, NaN, 0, 1, {}, {}, 'a', 'a'
, NaN];
console.log(arr.check()); //[false, true, undefined, null, 0, 1, Object, Object, "a"]
判断res数组的值是否首次出现的位置 没有首次出现则返回-1 过滤掉NaN
使用ES6的Set去重
var set =
new Set(
this);
return Array.from(set);
使用高阶函数filter去重
var r =
this.filter(
function(element,index,self){
return self.indexOf(element)===
index;
})
return r;
但是这三种去重都无法去除重复的Object
使用对象的key值去重
var arr=
[];
var obj =
{};
for(
var i=0;i<
this.length;i++
){
if(!obj[
this[i]]){
obj[this[i]]=1
;
arr.push(this[i])
}
}
return arr; // [false, true, undefined, null, NaN, 0, 1, Object, "a"]
这就去除了重复的对象
// 8.31补充
使用对象去除两个数组的重复项
var arr = [
"sina",
"qq",
"taobao",
"jd",
"baidu"]
var obj =
{}
for (
var i =
0; i < arr.length; i++
) {
var key =
arr[i]
obj[key] =
0
}
var arr2 = [
"qq",
"baidu",
"baidu"];
for (
var i =
0; i < arr2.length; i++
) {
var key =
arr2[i];
obj[key]++
}
var res =
[]
for (
var i
in obj) {
if (obj[i] ==
0) {
res.push(i)
}
}
console.log(res.sort()) // ["sina", "taobao", "jd"]
转载于:https://www.cnblogs.com/dirkhe/p/7399734.html
相关资源:数据结构—成绩单生成器