刷题 | 数组去重的4种方法引发的思考
Posted Jen Ho
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题 | 数组去重的4种方法引发的思考相关的知识,希望对你有一定的参考价值。
牛客网有一道题
要求去除输入数组的重复项,有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"]
以上是关于刷题 | 数组去重的4种方法引发的思考的主要内容,如果未能解决你的问题,请参考以下文章