function deRepeated(arr){//传入要去重的目标数组 var newArr=[]; for(var i=0;i<arr.length;i++){ //遍历目标数组各项,新数组中尚不存在的就把它存入新数组 if(newArr.indexOf(arr[i]) == -1){ newArr.push(arr[i]); } } return newArr;//返回去重后的新数组 } deRepeated([2,3,2,32,43,32,8,3,9,76,43,43,3,8,3]);//[2,3,32,43,8,9,76]
function deRepeated(arr){ var newArr=[]; for(var i=0;i<arr.length;i++){ //遍历目标数组各项,返回第一次出现的位置是i,说明不是重复项,存入新数组 if(arr.indexOf(arr[i]) == i){ newArr.push(arr[i]); } } return newArr; } deRepeated([2,3,2,32,43,32,8,3,9,76,43,43,3,8,3])//[2,3,32,43,8,9,76]
因为方法一和方法二都用到了ES5的indexOf()方法,有些浏览器可能不兼容。还可采用方法三:先对目标数组重排序,排序后重复项相邻,而后遍历目标数组。当排序后目标数组的项不是新数组的最后一项时,说明不是重复项,推入新数组。数组
function deRepeated(arr){ var newArr=[]; arr.sort(); for(var i=0;i<arr.length;i++){ //遍历目标数组,第i项和新数组末项比较 if(arr[i] !== newArr[newArr.length-1]){ newArr.push(arr[i]);//推入新数组末端 } } return newArr; } deRepeated([2,3,2,32,43,32,8,3,9,76,43,43,3,8,3]);//[2,3,32,43,76,8,9]
注意点:因为涉及到直接比较数组的项,因此应采用不全等方式"!==";
缺点:因为对目标数组进行先排序后去重,所以返回的也是排序后的新数组。浏览器
原理是遍历目标数组各项,保存为对象属性并统一给其设置属性值1,给重复的属性设置值时会覆盖原来的,而后遍历对象属性,因为返回的是字符串形式,应转为数字后再存入新数组。code
function deRepeated(arr){ var obj={}, newArr=[]; for(var i=0;i<arr.length;i++){ obj[arr[i]]=1; //给对象添加属性 } for(var j in obj){ //遍历对象属性 newArr.push(parseInt(j)); } return newArr; } deRepeated([2,3,2,32,43,32,8,3,9,76,43,43,3,8,3]);//[2,3,8,9,32,43,76]
在stackoverflow上看到了这种针对数组中为纯数字时的排序去重方法。对象
function deRepeated(arr){ arr.sort(function(a,b){ //对目标数组重排序,使有重复项的相邻 return a-b; }) var newArr=[arr[0]]; //第一项先放入新数组中 for(var i=1;i<arr.length;i++){ if(arr[i-1] !== arr[i]){ //迭代相邻项,找到不一样项时才推入新数组 newArr.push(arr[i]); } } return newArr; } console.log(deRepeated([2,3,8,2,3,43,8,43,2,5,3])); //[2,3,5,8,43]
利用ES6新增的对象内置类型Set,利用其元素不重复的特色,在实例内部实现自动去重。 排序
function deRepeated(arr){ var set=new Set(arr); arr.splice(0); arr.push(...set); return arr; //返回原数组 //return new Array(...set); //返回新数组 } var arr=[2,3,6,4,7,3,5,4,4,4]; console.log(deRepeated(arr)); //[2,3,6,4,7,5]