基本上秉承的就是遍历+查找的流程
一、优雅
1.1 set
ES6 新增了一种类似于数组的数据结构Set,和数组的区别在于 Set 中没有重复值。
- Set本身是一个构造函数,可以直接使用new命令来创建 Set 数据
- 因为它是一个类似数组结构,所以需要转型为真正的数组去使用。所以需要用
Array.from
或者...
展开符
//Array.from(object)可以从具有length属性或可迭代对象的任何对象返回Array对象
//...用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中
var arr = [1,2,2,2,3,4,4,5,6,6,7]
let newArr = [...new Set(arr)] //...ES6展开符
let newArr = Array.from(new Set(arr)) //Array.from
console.log(newArr)
1.2 reduce + includes
arr.reduce(callback,[initialValue])
arr.reduce(function(pre,cur,index,arr), [initialValue])
参数:
- function(必须):数组中每个元素需要调用的函数
- pre 上一次调用的返回值或者提供的初始值
- cur(必需):当前元素
- index(可选):当前元素的索引
- arr(可选):调用reduce的数组
- initialVal(可选):reduce调用的初始值
var arr = [2, 2, 2, 3, 4, 4, 5, 6, 6, 7]
let newArr = arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
}
console.log(newArr);
二、【循环】for|forEach|map|filter + 【查找】indexOf|includes
2.1 for循环 + indexOf | includes 查找
//indexOf - 查找当前元素在数组中的位置
//返回值:
// - 找到会返回第一个值的index并结束查找
// - 找不到返回-1
//ES6 - includes - 查找数组中是否包含该元素
//返回值:
// - 找到返回true
// - 找不到返回false
var arr = [1,2,2,2,3,4,4,5,6,6,7]
function unique(arr){
var newArr = []
for(let i in arr){
if(newArr.indexOf(arr[i]) == -1) //indexOf - 新数组找不到的加进去
if(arr.indexOf(arr[i]) == i) //indexOf - 老数组中找到第一个就加进去
if (!newArr.includes(arr[i])) //includes
{
newArr.push(arr[i])
}
}
return newArr
}
console.log(unique(arr))
2.2 forEach遍历 + indexOf | includes查找
arr.forEach(function(item, index, arr), thisValue)
thisValue
:(可选)当执行回调函数时this绑定对象的值,默认值为undefined,匿名函数中的this指向window
let arr = [1, 2, 2, 2, 3, 4, 2, 7, 4, 5, 6, 6, 7]
let newArr = []
arr.forEach((item,index) => {
if (newArr.indexOf(item) == -1) //indexOf - 新数组找不到的加进去
if (arr.indexOf(item) == index //indexOf - 老数组中找到第一个就加进去
if (!newArr.includes(item)) //includes
{
newArr.push(item)
}
})
console.log(newArr);
2.3 map遍历 + indexOf | includes查找
2.4 filter遍历 + indexOf | includes查找
arr.map(function(item, index, arr),thisValue)
arr.filter(function(item, index, arr),thisValue)
"同forEach,只需将forEach改为map|filter即可"
待补充
如:
sort排序后相邻去除法 博客园原贴-四
- 行不通,因为sort默认根据ASCII码排序的
some
- 同常规的遍历方法(forEach|map|filter),但用some做遍历去重不够语义化,不建议采用。