乐趣区

关于javascript:常用的数组去重方式

数组去重通用做法个别有两种办法:
1、两层循环
2、利用对象属性的不可重复性
还有一种是语言自身 api 个性,js 利用 indexOfincludesSet 等办法

将上面合过属性进行去重操作

let arr = [1, 1, "true", "true", true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, "NaN", 0, 0, "a", "a", {}, {}, 1, "true", true, 15, false, 'false', undefined, null, NaN, "NaN", 0, {}];

用 Set 去重

无奈对对象去重

const newArr = Array.from(new Set(arr));
// 等价于
const newArr = [...new Set(arr)];

console.log(newArr)

for 循环嵌套 for 循环,用 splice 去重

第一个和第二个雷同,用 splice 删掉第二个

对象和 NaN 无奈去重

Tips:会扭转原数组

for 循环能够用 forEachmap 等代替,逻辑都差不多

for (let i = 0; i < arr.length; i++) {for (let j = i + 1; j < arr.length; j++) {if (arr[i] === arr[j]) {arr.splice(j, 1);
    }
  }
}
console.log(arr);

indexOf 去重

新建一个数组,for 循环原数组,判断新数组中有没有以后元素,有就跳过,没有就放进去。

对象和 NaN 无奈去重

let newArr = [];
for (let i = 0; i < arr.length; i++) {if (newArr.indexOf(arr[i]) === -1) {newArr.push(arr[i]);
  }
}
console.log(newArr);

includes 去重

应用办法和 indexOf 差不多,但它能够对 NaN 去重

对象无奈去重

let newArr = [];
for (let i = 0; i < arr.length; i++) {if (!newArr.includes(arr[i])) {newArr.push(arr[i]);
  }
}
console.log(newArr);

利用 sort 排序

利用 sortfor 循环 sort 排序后的数组,比拟以后数组和以后数组的前一项,如果相等就跳过

对象和 NaN 无奈去重

Tips:如果排序进去雷同的有距离,则距离的无奈去重,比方:[true, 'true', true]

arr = arr.sort();
let newArr = [];
for (let i = 0; i < arr.length; i++) {if (arr[i] !== arr[i - 1]) {newArr.push(arr[i]);
  }
}
console.log(newArr)

利用 filter 配合 indexOf

和遍历差不多,应用 indexOf 的话 NaN 全副被去掉了(不包含 'NaN'),因为用 indexOf 找不到 NaN

对象不会被去重

const newArr = arr.filter((item, index, array) => array.indexOf(item) === index
);
console.log(newArr);

利用 reduce 配合 includes

const newArr = arr.reduce((prev, cur) => (prev.includes(cur) ? [...prev] : [...prev, cur]),
  []);
console.log(newArr);

利用 filter 和 hasOwnProperty

定义一个空对象

filter 遍历数组,应用 hasOwnProperty 判断 obj 上有没有这个属性,如果有,就返回 false 如果没有返回 true,并将这个值以属性的形式保留在 obj

Tips:对象无奈去重,最初只会保留一个对象

var obj = {};
let newArr = arr.filter(function (item, index, arr) {return obj.hasOwnProperty(typeof item + item)
    ? false
    : (obj[typeof item + item] = true);
});
console.log(newArr);

以上数组去重的形式,都有一点有缺点,要写出完满的去重形式须要思考多种数据类型,这里不做过多探讨,下面几种形式的去重可根本满足日常工作的须要。

退出移动版