思想:
1.只有NaN不等于自身,通过这个特性去区分处理
2.通过一个变量开关,去控制添加次数(在循环中通过if条件)
3.找到第一次第一次就命中条件的,通过开关的作用把第一次的命中的元素push到数组中,后面的NaN重复的自然也就添加不进去
3.其他元素添加与否的条件通过判断数组中是否已经存在,通过indexOf,如果为-1就是不存在则添加。
var arr = [false,true,undefined,null,null,NaN,0,1,{},{},'a','a',NaN]; // 期望输出结果: // [false,true,undefined,null,NaN,0,1,{},{},'a']; function fn(arr){ let flag = true; //控制相同元素添加次数的开关 let newArr = []; arr.forEach((item,index)=>{ // item != item 是为了筛出来NaN,因为不等于自身的只有NaN // NaN === NaN 是false,其他的都为true if(item!=item){ if(flag){ newArr.push(item) //通过开关,把最先出现的那个NaN添加进了数组中,保证了新数组的顺序 flag=false; //添加一次成功后,开关关闭 } }else{ // 新数组中不存在的才会push到新数组中 if(newArr.indexOf(item)===-1){ newArr.push(item) } } }) return newArr; } var res = fn(arr); console.log(res);