首先数组去重有很多方法,这里看见几个特别好的。
var Arr = [0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9]; function unArray (Arr) { var newArr = []; for (var i = 0; i < Arr.length; i++) { if (newArr.indexOf(Arr[i]) == -1){//检测newArr数组里是否包含Arr数组的内容,==-1检索的字符串没有出现则为-1 newArr.push(Arr[i])//把Arr数组的第i项插入新数组 } }; return newArr; } unArray(Arr); 作者:臭臭臭魁 链接:https://www.jianshu.com/p/a042f4dc0d75 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
第一个方法,用了indexof的特性,判断数组中是否有此元素。最开始数组是空的,然后添加进去元素,当第二次遇到元素判断数组里面有没有,没有的话才添加进去。
var Arr = [0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9]; function unArray (Arr) { var newArr = [Arr[0]]; for (var i = 0; i < Arr.length; i++) { if (Arr.indexOf(Arr[i]) == i){//检测Arr数组第一次出现的位置是i newArr.push(Arr[i])//把Arr数组的第i项插入新数组newArr } }; return newArr;//返回新数组newArr } unArray(Arr); //console.log(unArray(Arr)); 作者:臭臭臭魁 链接:https://www.jianshu.com/p/a042f4dc0d75 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
第二种方法,indexof是判断他首次出现的index。i是自然增长的,如果不出现重复的字符那么每一次都能推一个元素到新数组中。一个字符对应一个他首次出现的位置,i是变得传进去的东西也在变。当第二次传相同的字符进去,和i不同所以就不行了。
var Arr = [0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9]; function unArray (Arr) { var newArr = [],hash = {};//hash位hash表 for (var i = 0; i < Arr.length; i++) { if (!hash[Arr[i]]){//如果hash表里没有第i项则 hash[Arr[i]] = true;//把第i项插入到hash表里 newArr.push(Arr[i])//把Arr数组的第i项插入新数组。此方法的时间消耗长,内存消耗大; } }; return newArr; } unArray(Arr); 作者:臭臭臭魁 链接:https://www.jianshu.com/p/a042f4dc0d75 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
这是种哈希算法,看不懂,就这样吧。
Array.prototype.distinct = function(){ var arr = this, result = [], i, j, len = arr.length; for(i = 0; i < len; i++){ for(j = i + 1; j < len; j++){ if(arr[i] === arr[j]){ j = ++i; } } result.push(arr[i]); } return result; } var arra = [1,2,3,4,4,1,1,2,1,1,1]; arra.distinct(); //返回[3,4,2,1]
这是双循环去重,
var arr = [1,2,3,3,4,5,5]; var set = new Set(arr); var newArr = Array.from(set);
这是es6去重,有点简单粗暴。
function unique3(arr){ var res = []; var obj = {}; for(var i=0; i<arr.length; i++){ if( !obj[arr[i]] ){ obj[arr[i]] = 1; res.push(arr[i]); } } return res; }
这种也比较简单,总得来说简单的方法,就是循环遍历一遍。然后借助其他方法完成。