今天学习一下「数组去重」的多种办法!

双层 for 循环

  1. var arr = [1, 1, 2, 6, 3, 5, 0, 3, 6, 8, 9, 4, 4, 2, 0, 9, 5, 2];
  2. function unqueArr(array) {
  3. var _arr = [];
  4. var isRepeat;
  5. for (let i = 0; i < array.length; i++) {
  6. isRepeat = false;
  7. for (let j = 0; j < _arr.length; j++) {
  8. // 比较 _arr 和 array 的每一项
  9. if (_arr[j] === array[i]) {
  10. isRepeat = true;
  11. break;
  12. }
  13. }
  14. // 如果为 false 说明 _arr 中不存在
  15. if (!isRepeat) {
  16. _arr.push(array[i]);
  17. }
  18. }
  19. return _arr;
  20. }
  21. console.log(unqueArr(arr)); // [1, 2, 6, 3, 5, 0, 8, 9, 4]

filter + indexOf

  1. var arr = [1, 1, 2, 6, 3, 5, 0, 3, 6, 8, 9, 4, 4, 2, 0, 9, 5, 2];
  2. function unqueArr1(array) {
  3. return array.filter(function (item, index) {
  4. // indexOf() 会返回数据在数组中第一个位置
  5. // 假如 indexOf(1) 返回 0
  6. // 所以就是 indexOf(1) = 0 和 index = 0 比较为 true
  7. // 如果是 indexOf(1) = 0 和 index = 1 比较为 false
  8. return array.indexOf(item) === index;
  9. });
  10. }
  11. console.log(unqueArr1(arr)); // [1, 2, 6, 3, 5, 0, 8, 9, 4]

forEach + indexOf

  1. var arr = [1, 1, 2, 6, 3, 5, 0, 3, 6, 8, 9, 4, 4, 2, 0, 9, 5, 2];
  2. function unqueArr2(array) {
  3. var _arr = [];
  4. array.forEach((element) => {
  5. if (_arr.indexOf(element) === -1) {
  6. _arr.push(element);
  7. }
  8. });
  9. return _arr;
  10. }
  11. console.log(unqueArr2(arr)); // [1, 2, 6, 3, 5, 0, 8, 9, 4]

forEach + includes

这个方法个indexOf是一样的道理,都是检查新数组中是否存在某个值。 :::info includes检查数组中是否包含某个元素,返回true或者false
indexOf检查数组中是否包含某个元素,返回该元素在数组中的下标

indexOfNaN数据是无效的,会返回-1 :::

  1. var arr = [1, 1, 2, 6, 3, 5, 0, 3, 6, 8, 9, 4, 4, 2, 0, 9, 5, 2];
  2. function unqueArr3(array) {
  3. var _arr = [];
  4. array.forEach((item) => {
  5. if (!_arr.includes(item)) {
  6. _arr.push(item);
  7. }
  8. });
  9. return _arr;
  10. }
  11. console.log(unqueArr3(arr)); // [1, 2, 6, 3, 5, 0, 8, 9, 4]

for + sort

  1. var arr = [1, 1, 2, 6, 3, 5, 0, 3, 6, 8, 9, 4, 4, 2, 0, 9, 5, 2];
  2. function unqueArr4(array) {
  3. var _arr = [];
  4. array.sort();
  5. // 排序后
  6. // [0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 8, 9, 9]
  7. for (let i = 0; i < array.length; i++) {
  8. // 该方法原理就是用数组的前一项和后一项进行对比
  9. // 0 !== 0 返回 false,所以就不会 push
  10. // 0 !== 1 返回 true,所以就会 push(0)
  11. // 1 !== 1 返回 false,所以就不会 push
  12. // 1 !== 2 返回 true,所以就会 push(1)
  13. if (array[i] !== array[i + 1]) {
  14. _arr.push(array[i]);
  15. }
  16. }
  17. return _arr;
  18. }
  19. console.log(unqueArr4(arr)); // [1, 2, 6, 3, 5, 0, 8, 9, 4]

sort + reduce

该方法的道理和for + sort的方式道理是一样的

  1. var arr = [1, 1, 2, 6, 3, 5, 0, 3, 6, 8, 9, 4, 4, 2, 0, 9, 5, 2];
  2. function unqueArr5(array) {
  3. // 先排序
  4. // [0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 8, 9, 9]
  5. return array.sort().reduce((prev, item) => {
  6. // 0 肯定是满足条件所以 push(0) , [0]
  7. // prev[prev.length - 1] 也就是 0, 0 !== 0 返回 false 所以不会push
  8. // 然后 prev[prev.length - 1] 还是 0,0 !== 1 返回 true,所以就会 push(1),[0, 1]
  9. // 然后 prev[prev.length - 1] 拿到 1 ,1 和 1 比较返回 false 所以不会 push
  10. if (prev.length === 0 || prev[prev.length - 1] !== item) {
  11. prev.push(item);
  12. }
  13. return prev;
  14. }, []);
  15. }
  16. console.log(unqueArr5(arr)); // [1, 2, 6, 3, 5, 0, 8, 9, 4]

for + map

  1. var arr = [1, 1, 2, 6, 3, 5, 0, 3, 6, 8, 9, 4, 4, 2, 0, 9, 5, 2];
  2. function unqueArr6(array) {
  3. var _arr = [];
  4. var _temp = new Map();
  5. for (let index = 0; index < array.length; index++) {
  6. // 如果 map 中没有 1 这个属性就会添加到 map 对象中 Map{1:1}
  7. // 如果 map 中没有 2 这个属性就会添加到 map 对象中 Map{1:1, 2:1}
  8. if (!_temp.get(array[index])) {
  9. // 添加到 map 对象里,方便下次判断
  10. _temp.set(array[index], 1);
  11. // push 进数组中
  12. _arr.push(array[index]);
  13. }
  14. }
  15. return _arr;
  16. }
  17. console.log(unqueArr6(arr)); // [1, 2, 6, 3, 5, 0, 8, 9, 4]

Array.from + Set

  1. var arr = [1, 1, 2, 6, 3, 5, 0, 3, 6, 8, 9, 4, 4, 2, 0, 9, 5, 2];
  2. function unqueArr6(array) {
  3. // 利用 Set 不能唯一的特性
  4. // 然后将 Set 转化成数组
  5. return Array.from(new Set(array));
  6. }
  7. console.log(unqueArr6(arr)); // [1, 2, 6, 3, 5, 0, 8, 9, 4]