距离上次发文,已经有一段时间了,最近工作比较忙,这不眼看快双十一了,就相当于给大家一些福利吧!
一、什么是数组去重
简单说就是把数组中重复的项删除掉,你 GET 到了吗 ?下面我将简单介绍下几种基本的方法及其优缺点。
二、方法汇总
- 两层循环
** 无相同值直接 push 进新数组,有相同的值则直接跳过本次内部循环 **
/* * @param {Array} arr -要去重的数组 * @param {Array} result -初始化结果数组 */ const unique = (arr, result = []) => { const len = arr.length; for (let i = 0; i < len; i++) { for (let j = i + 1; j < len; j++) { if (arr[i] === arr[j]) { // 相等则直接跳过 j = ++i; } } result.push(arr[i]); } return result; }** 相同的做标记,与新数组作比较,没有则插入 **
/* * @param {Array} arr -要去重的数组 * @param {Array} result -初始化结果数组 */ const unique = (arr, result = []) => { result.push(arr[0]); const len = arr.length; let rLen = result.length; for (let i = 1; i < len; i++) { let flag = false; for (var j = 0; j < rLen; j++) { if (arr[i] === result[j]) { flag = true; break; } } if (!flag) { rLen++; result.push(arr[i]); } } return result; } ** 原地算法(在数组本身操作) **
const unique = arr => { const len = arr.length; for (let i = 0; i < len; i++) { for (let j = i + 1; j < len; j++) { if (arr[i] == arr[j]) { arr.splice(j,1); len--; j--; } } } return arr; };看似代码代码简单,实则内存占用高,不实用
- 单层循环
** 对象键不能重复 **
const unique = (arr, result = []) => { const obj = {}; const len = arr.length; for (let i = 0; i< len; i++) { if (!obj[arr[i]]) { // 键没有,则添加 obj[arr[i]] = 1; result.push(arr[i]); } } return result; };这种方法无法判断
'1'和1等类型,解决方案:
- 添加判断数据类型,比如
typeof,obj[typeof arr[i] + arr[i]]不过这还是判断不了['1']和
