问题:同标题 要求:考虑值类型
@kevinIsCoder 还可以简化一下
let arr=[1,1,1,2] [...new Set(arr)]
function unique(array){ var n = [];//临时数组 for(var i = 0;i < array.length; i++){ if(n.indexOf(array[i]) == -1) n.push(array[i]); } return n; }
ES6:
Array.from(new Set(arr));
var arr = [1,3,1,4,1,5,6,3,1,2]; Array.from(new Set(arr));//[1, 3, 4, 5, 6, 2]
利用对象字面量的key与value关联性,写起来比较简单,未测试性能,考虑到只遍历一次,速度应该很快。
function distinct(arr) { var obj = {}, i = 0, len = 0; if (Array.isArray(arr) && arr.length > 0) { len = arr.length; for (i = 0; i < len; i += 1) { obj[arr[i]] = arr[i]; } return Object.keys(obj); } return []; }
jQuery.unique( array );
用法见jQuery.unique()
最快的方法是用jQuery:
var arr = ["1","2","3","4","5","4","3"]; var uniqueArr = []; $.each(arr, function(i, el){ if($.inArray(el, uniqueArr) === -1) uniqueArr.push(el); });
不用jQuery, 你可以先排序,然后遍历此Array, 比较前后两个元素的值.
var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7]; var sortedArr = arr.sort(); var results = []; for (var i = 0; i < arr.length - 1; i++) { if (sortedArr[i + 1] == sortedArr[i]) { results.push(sortedArr[i]); } } alert(results);
http://docs.closure-library.googlecode.com/git/closure_goog_array_array.js.source.html#line887
看看 closure 的去重代码吧。这个不错。
通过indexOf匹配字符首次出现的位置和它的下标索引来确定它是否已经出现过了 const arr = [1,2,3,2,1] return arr.filter((current, index, self) => { return self.indexOf(current) === index })
var arr = [1, 2, 3, "1", "a", "a", "3", 5, "2", "5", 1, 2, 3, 5]; function reDuplicates(arr) { var newArr = []; for(var i = 0, len = arr.length; i < len; i ++) { for(var j = 0; j < newArr.length; j ++) { var bol; if(bol = ~function() { if(arr[i] === newArr[j]) return -2; return -1; }()) break; } if(bol) continue; newArr.push(arr[i]); } return newArr; } console.log(arr); console.log(reDuplicates(arr));
// [1, 2, 3, "1", "a", "a", "3", 5, "2", "5", 1, 2, 3, 5]// [1, 2, 3, "1", "a", "3", 5, "2", "5"]
不用set的话,最好的方式还是hash + shallowequal。排序复杂度太高了
Array.prototype.unique = function() { var res = [] var json = {} for (var i = 0; i < this.length; i++) { if(!json[this[i]]){ // 利用对象属性不重复 res.push(this[i]) json[this[i]] = 1 // 传值随意 } } return res } /*你就可以像下面这样调用该函数了*/ var arr = [2,4,66,55,33,55,3,4,4,32,2] console.log(arr.unique())
包含NaN值得ES5写法,数组以及函数不会去重
function unique(array) { var n = [] var nflag = false for (var i = 0; i < array.length; i++) { if (isNaN(array[i]) && !nflag && typeof array[i] == 'number') { nflag = true n.push(array[i]) } if (n.indexOf(array[i]) === -1) { if (!isNaN(array[i]) || typeof array[i] !== 'number') { n.push(array[i]) } } } return n; }
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(13)
@kevinIsCoder 还可以简化一下
ES6:
利用对象字面量的key与value关联性,写起来比较简单,未测试性能,考虑到只遍历一次,速度应该很快。
用法见jQuery.unique()
最快的方法是用jQuery:
不用jQuery, 你可以先排序,然后遍历此Array, 比较前后两个元素的值.
http://docs.closure-library.googlecode.com/git/closure_goog_array_array.js.source.html#line887
看看 closure 的去重代码吧。这个不错。
Array.from(new Set(arr));
// [1, 2, 3, "1", "a", "a", "3", 5, "2", "5", 1, 2, 3, 5]
// [1, 2, 3, "1", "a", "3", 5, "2", "5"]
不用set的话,最好的方式还是hash + shallowequal。排序复杂度太高了
包含NaN值得ES5写法,数组以及函数不会去重