[js] 过滤数组中重复的数字或字符串元素 array 去重
利用indexOf、filter
Array.prototype.indexOf()、Array.prototype.filter()属于ES5
function array_unique(arr) { return arr.filter(function(e,i){ return arr.indexOf(e)===i; }) } console.log(array_unique([1, 2, 3, 4, 4, 3, 2, 1, 1]));//[1, 2, 3, 4] console.log(array_unique([1, 2, 3, 4, 4, 3, 2, 1, 1,5,'5']));//[1, 2, 3, 4, 5, "5"]
利用hash
单一数据类型hash很快
字符串和数字混合的话会出错
function array_unique(arr) { var hash = {}, result = []; for (var i = 0; i < arr.length; i++) { if (!hash[arr[i]]) { hash[arr[i]] = true; result.push(arr[i]); } } console.log(hash); return result; } console.log(array_unique([4, 3, 2, 1, 1, 2, 3, 4]));//[4, 3, 2, 1] console.log(array_unique([4, 3, 2, 1, 1, 5, '5', 1, 2, 3, 4]));//[4, 3, 2, 1, 5]
排序后比较
缺点是除非进行深复制,不然会改变原数组(排序了),而且sort()在有数字和字母时不稳定
function array_unique(arr) { arr.sort(); var result = []; for (var i = 0; i < arr.length; i++) { if (arr[i] !== arr[i + 1]) { result.push(arr[i]); } } return result; } console.log(array_unique([4, 3, 2, 1, 1, 2, 3, 4]));//[1, 2, 3, 4] console.log(array_unique([4, 3, 2, 1, 1, 5, '5', 1, 2, 3, 4]));//[1, 2, 3, 4, "5", 5]
两层循环
//方法一 function array_unique(arr) { var result = [arr[0]], isRepeat; for (var i = 0; i < arr.length; i++) { isRepeat = false; for (var j = 0; j < result.length; j++) { if (result[j] === arr[i]) { isRepeat = true; break; } } if (!isRepeat) { result.push(arr[i]); } } return result; } console.log(array_unique([4, 3, 2, 1, 1, 2, 3, 4])); //[4, 3, 2, 1] console.log(array_unique([4, 3, 2, 1, 1, 5, '5', 1, 2, 3, 4])); //[4, 3, 2, 1, 5, "5"] //方法二 function array_unique(arr) { var result = [], length = arr.length; for (var i = 0; i < length; i++) { for (j = i + 1; j < length; j++) { if (arr[i] === arr[j]) { j = ++i; //++i也就是第二层循环结束直接进入了第一层循环 } } result.push(arr[i]); } return result; } console.log(array_unique([4, 3, 2, 1, 1, 2, 3, 4]));//[1, 2, 3, 4] console.log(array_unique([4, 3, 2, 1, 1, 5, '5', 1, 2, 3, 4]));//[5, "5", 1, 2, 3, 4]
删除掉数组中重复的元素
改变原数组
//JQ源码的写法 function array_unique(results) { var elem, duplicates = [], i = 1, j = 0; results.sort(); for (; elem = results[i]; i++) { if (elem === results[i - 1]) { j = duplicates.push(i); } } while (j--) { results.splice(duplicates[j], 1); } return results; }; console.log(array_unique([4, 3, 2, 1, 1, 2, 3, 4])); //[1, 2, 3, 4] console.log(array_unique([4, 3, 2, 1, 1, 5, '5', 1, 2, 3, 4])); //[1, 2, 3, 4, "5", 5]