总结来看,去重分三种思路:

  • es6的 Set 数据结构
  • Array的各类api
  • 利用对象的属性

文章参考:https://segmentfault.com/a/1190000016418021

一、利用 ES6 Set 去重(ES6 中最常用)

  1. arr_test = [0,0,999,999,'字符串','字符串',true,true,false,false,undefined,undefined,null,null,NaN,NaN,{},{},[],[],]
  2. let unique_set = arr => {
  3. return Array.from(new Set(arr))
  4. }
  5. console.log(unique_set(arr_test))

或者……

  1. console.log([...new Set(arr_test)])

image.png :::danger 去不掉

  • {}
  • [] :::

二、利用 for 嵌套 for,然后 splice 去重(ES5 中最常用)

  1. arr_test = [0,0,999,999,'字符串','字符串',true,true,false,false,undefined,undefined,null,null,NaN,NaN,{},{},[],[],]
  2. let unique_for_for_splice = arr => {
  3. for (let i = 0; i < arr.length; i++) {
  4. for (let j = i + 1; j < arr.length; j++) {
  5. if (arr[i] === arr[j]) {
  6. arr.splice(j, 1)
  7. }
  8. }
  9. }
  10. return arr
  11. }
  12. console.log(unique_for_for_splice(arr_test))

image.png :::danger 去不掉

  • NaN
  • {}
  • [] :::

    三、利用 includes/indexOf 去重

  1. let unique_includes = arr => {
  2. let result = []
  3. arr.forEach(data => {
  4. if (!result.includes(data)) result.push(data)
  5. })
  6. return result
  7. }
  8. console.log(unique_includes(arr_test))
  1. let unique_indexof = arr => {
  2. let result = []
  3. arr.forEach(data => {
  4. if (result.indexOf(data) === -1) result.push(data)
  5. })
  6. return result
  7. }
  8. console.log(unique_indexof(arr_test))

image.png

四、利用 sort()

  1. let unique_sort = arr => {
  2. arr.sort().forEach((data, index) => {
  3. if (data === arr[index + 1] && index < arr.length - 1)
  4. arr.splice(index + 1, 1)
  5. })
  6. return arr
  7. }
  8. console.log(unique_indexof(arr_test))

image.png

五、利用 filter

  1. let unique_filter = arr => {
  2. return arr.filter((data, index, arr) => {
  3. return arr.indexOf(data, 0) === index;
  4. })
  5. }
  6. console.log(unique_filter(arr_test))

image.png

六、利用 reduce

  1. let unique_reduce = arr => {
  2. return arr.reduce((a, b) => (a.includes(b) ? a : [...a, b]), [])
  3. }
  4. console.log(unique_reduce(arr_test))

image.png

利用对象的属性不能相同的特点进行去重(这种数组去重的方法有问题,不建议用,有待改进)

  1. function unique(arr) {
  2. if (!Array.isArray(arr)) {
  3. console.log('type error!')
  4. return
  5. }
  6. var arrry= \[\];
  7. var obj = {};
  8. for (var i = 0; i < arr.length; i++) {
  9. if (!obj\[arr\[i\]\]) {
  10. arrry.push(arr\[i\])
  11. obj\[arr\[i\]\] = 1
  12. } else {
  13. obj\[arr\[i\]\]++
  14. }
  15. }
  16. return arrry;
  17. }
  18. var arr = \[1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}\];
  19. console.log(unique(arr))
  20. //\[1, "true", 15, false, undefined, null, NaN, 0, "a", {…}\] //两个true直接去掉了,NaN和{}去重

利用 hasOwnProperty

  1. function unique(arr) {
  2. var obj = {};
  3. return arr.filter(function(item, index, arr){
  4. return obj.hasOwnProperty(typeof item + item) ? false : (obj\[typeof item + item\] = true)
  5. })
  6. }
  7. var arr = \[1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}\];
  8. console.log(unique(arr))
  9. //\[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}\] //所有的都去重了

利用 hasOwnProperty 判断是否存在对象属性

利用递归去重

  1. function unique(arr) {
  2. var array\= arr;
  3. var len = array.length;
  4. array.sort(function(a,b){ //排序后更加方便去重
  5. return a - b;
  6. })
  7. function loop(index){
  8. if(index >= 1){
  9. if(array\[index\] === array\[index\-1\]){
  10. array.splice(index,1);
  11. }
  12. loop(index - 1); //递归loop,然后数组去重
  13. }
  14. }
  15. loop(len\-1);
  16. return array;
  17. }
  18. var arr = \[1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}\];
  19. console.log(unique(arr))
  20. //\[1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined\]

利用 Map 数据结构去重

  1. function arrayNonRepeatfy(arr) {
  2. let map = new Map();
  3. let array = new Array(); // 数组用于返回结果
  4. for (let i = 0; i < arr.length; i++) {
  5. if(map .has(arr\[i\])) { // 如果有该key值
  6. map .set(arr\[i\], true);
  7. } else {
  8. map .set(arr\[i\], false); // 如果没有该key值
  9. array .push(arr\[i\]);
  10. }
  11. }
  12. return array ;
  13. }
  14. var arr = \[1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}\];
  15. console.log(unique(arr))
  16. //\[1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined\]

创建一个空 Map 数据结构,遍历需要去重的数组,把数组的每一个元素作为 key 存到 Map 中。由于 Map 中不会出现相同的 key 值,所以最终得到的就是去重后的结果。

PS:有些文章提到了 foreach+indexOf 数组去重的方法,个人觉得都是大同小异,所以没有写上去。