第一次写技术博客,以前老是认为写这些会很浪费时间,还不如多看几篇技术博文。但。。。但昨天不知道受了什么刺激,好像有什么在驱使着本身要写同样,因此才有了今天的第一篇博文。总以为应该要坚持这样写下去。初次写,并不知道写些什么,就慢慢地整理些以往的总结吧!数组
文中若是有哪里写得不许确或者有任何建议的,欢迎绝不吝啬地指出!数据结构
如今,咱们就切入主题吧!哈哈~~ 下面是我整理的目前想到的几种数据去重方法:性能
方法一:原理:利用indexOf()遍历数组,若是临时数组找不到该元素,则push到临时数组,不然不作处理spa
function uniqArr1(arr) { var res = []; for (var i = 0,len = arr.length; i < len; i++) { if (res.indexOf(arr[i]) == -1) { res.push(arr[i]); } } return res; }
}
方法二:原理:一样利用indexOf()遍历数组,若是元素首次出现位置和它的索引相等,则说明不是重复元素,push到临时数组,不然不作处理code
function uniqArr2(arr) { var res = [arr[0]]; for (var i = 1,len = arr.length; i < len; i++) { if (arr.indexOf(arr[i]) == i) { res.push(arr[i]); } } return res; }
方法三:原理:利用对象键值惟一性,若是对象没有该属性,则添加该属性,同时将该元素push到临时数组对象
function uniqArr3(arr) { var obj = {}, res = []; for (var i = 1,len = arr.length; i < len; i++) { if (!obj[arr[i]]) { obj[arr[i]] = true; res.push(arr[i]); } } return res; }
方法四:原理:一样利用对象键值惟一性,惟一不一样的地方是这里再也不使用临时数组变量,而是利用Object.keys()方法将去重后的结果返回blog
注意:这里的返回结果跟上述几种不太一致,缘由是这里是对象的key,每一项都是字符串的形式,同时返回的结果数组元素的顺序是不肯定的排序
function uniqArr4(arr) { var obj = {}; for (var i = 1,len = arr.length; i < len; i++) { if (!obj[arr[i]]) { obj[arr[i]] = true; } } return Object.keys(obj); }
方法五:原理:先对原数组进行排序,临时数组先存储第一个元素,而后从第二个元素开始循环判断排序后的原数组(arr)是否与临时数组(res)的第length-1个元素(即res的最后一个元素,也即res每次新添加的元素)是否相等,若不相等,则push到res,这样就确保了每次push到res中的都是不重复的。索引
注意:这里返回的结果数组一样顺序是有变化的(方法四顺序也有变化)字符串
function uniqArr5(arr) { arr.sort(); var res = [arr[0]]; for (var i = 1,len = arr.length; i < len; i++) { if (arr[i] !== res[res.length -1]) { res.push(arr[i]); } } return res; }
方法六:原理:嵌套循环,若是相等,则截掉后面的,这里要注意splice会影响到原数组,因此这里从新计算了len值和j值。
function uniqArr6(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = i + 1; j < len; j++) { if (arr[i] === arr[j]) { arr.splice(j, 1); len = arr.length; j--; } } } return arr; }
方法七:原理:ES6新的数据结构set,相似数组,但成员的值都是惟一的,因此利用这个特性能够作到数组去重
function uniqArr7(arr) { var res = new Set(arr); return [...res]; }
暂且先分析了几种去重方法的实现原理,关于上述几种去重方法的性能分析后面将进行补充。。。