三种方式实现数组去重

从数组中过滤掉重复项并仅返回唯一值的三种方法

	const arr = ['a', 1, 2, 'a', 3, 2, 'b'];
	
	// set
	const res1 = [...new Set(arr)];  //  [ 'a', 1, 2, 3, 'b' ]
	console.log(res1);
	console.log(arr);
	// filter
	const res2 = arr.filter((item, index) => arr.indexOf(item) === index);  //  [ 'a', 1, 2, 3, 'b' ]
	console.log(res2);
	console.log(arr);
	
	// reduce
	const res3 = arr.reduce((unique, item) => unique.includes(item) ? unique: [...unique, item], []); //  [ 'a', 1, 2, 3, 'b' ]›
	console.log(res3);
	console.log(arr);

1.使用set

Set是ES6中引入的新数据对象。因为Set只允许您存储唯一值。传入数组时,它将删除任何重复的值。

使用set过滤数组共需要执行两步:

	const arr = ['a', 1, 2, 'a', 3, 2, 'b'];
    // 1: 创建set对象
    const setArr = new Set(arr);
    // 2L: 返回新的array
    const res = Array.from(setArr);  // [ 'a', 1, 2, 3, 'b' ]
    // es6写法	[...setArr]
    
    console.log(res); 

set的本质是一个key唯一的object-array

set数组去除重复

2. 使用filter

const arr = ['a', 1, 2, 'a', 3, 2, 'b'];

const res = arr.filter((item, index) => {
  console.log(
    // 1. item
    item,
    // 2. index 
    index,
    // 3. indexOf
    arr.indexOf(item),
    // 4. compare
    arr.indexOf(item) === index,
  );

  return arr.indexOf(item) === index;
})

通过indexOf判断索引值唯一的元素并返回。
filter数组去除重复

3.使用reduce

reduce方法用于减少数组的元素,并根据您传递的某些reducer函数将它们组合成最终数组

const arr = ['a', 1, 2, 'a', 3, 2, 'b'];

const res = arr.reduce((unique, item) => {
  console.log(
    // 1. item
    item,
    // 2. unique 
    unique,
    // 3. includes
    unique.includes(item),
    // 4. compare
    unique.includes(item) ? unique: [...unique, item],
  );

  return unique.includes(item) ? unique: [...unique, item];
})

console.log(res);

代码运行效果:

1 'a' false [ 'a', 1 ]
2 [ 'a', 1 ] false [ 'a', 1, 2 ]
a [ 'a', 1, 2 ] true [ 'a', 1, 2 ]
3 [ 'a', 1, 2 ] false [ 'a', 1, 2, 3 ]
2 [ 'a', 1, 2, 3 ] true [ 'a', 1, 2, 3 ]
b [ 'a', 1, 2, 3 ] false [ 'a', 1, 2, 3, 'b' ]
[ 'a', 1, 2, 3, 'b' ]

reduce通过创建unique来存储返回的数组
reduce数组去重复

参考资源

MDN JavaScript

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值