数组去重
探讨几种数组去重的方法,多几个思路和解题方法终归是好的。
一、双循环for嵌套 (ES5常用)
比较简单的方法,外层循环元素,内层循环检查是否重复,当有重复的值时,就删除掉。
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
function unique(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) { // 如果有重复值
arr.splice(j, 1) // splice方法删除重复值
// 删除后会改变数组长度,下标减1
j--
}
}
}
return arr
}
console.log(unique(arr))
- 会返回去重后的原数组。
- ["true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]。
- NaN 和 {} 没有去除。
- 如果数组很长,这种方法占用内存很高,效率最低。
二、indexOf去重 (ES5常用)
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
var newArr = []; // 新建一个空数组
for (var i = 0; i < arr.length; i++) { // 循环原数组
if (newArr.indexOf(arr[i]) == -1) { // 判断新数组newArr里是否存在循环的arr[i]的值,如果有则跳过
newArr.push(arr[i]) // 没有就push进新数组
}
}
return newArr
}
console.log(unique(arr))
- 返回新数组。
- [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0,。 "a", {…}, {…}]。
- NaN 和 {} 没去重。
- 效率相对较高。
三、ES6的Set数据结构特性
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
function unique(arr) {
return Array.from(new Set(arr)) // Set里的成员具有唯一性
}
console.log(unique(arr))
- 返回去重后的新数组。
- [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]。
- {} 无法去重。
- 性能高。
四、对象属性key唯一的特性去重
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
function unique(arr) {
var obj = {}
var newArr = []
for (var i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) {
obj[arr[i]] = 1
newArr.push(arr[i])
}
}
return newArr
}
console.log(unique(arr))
- 返回去重后的原数组。
- [1, "true", 15, false, undefined, null, NaN, 0, "a", {…}]。
- true和'NaN'消失。
- 性能很高。
- 最好保证类型可控
方法大都类似,以上几种算是较常用的,其他的就不写了!