js06_数组去重方法

基本上秉承的就是遍历+查找的流程

一、优雅

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(必须):数组中每个元素需要调用的函数
    1. pre 上一次调用的返回值或者提供的初始值
    2. cur(必需):当前元素
    3. index(可选):当前元素的索引
    4. 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做遍历去重不够语义化,不建议采用。
对象属性 Object.keys
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值