1. 利用 es6 的 iterable 数据结构 set
原理:
ES6 提供了新的数据结构 Set. 它类似于数组, 但是成员的值都是唯一的, 没有重复的值.
利用的算法类似'===', 与'==='的区别是 '==='认为 NaN != NaN ,set 的算法认为它们是相等的, 但是 set 认为对象都是不相等的.
Set 本身是一个构造函数, 用来生成 Set 数据结构.
- const set = new Set([1, 2, 3, 4, 4]);
- [...set]
- // [1, 2, 3, 4]
Array.from() 可以将 set 结构转成数组.
- distinct = (arr) =>{
- return Array.from(new Set(arr));
- }
- distinct([1,2,3,4,5,6,1,3,5,7,2]);
- => [1, 2, 3, 4, 5, 6, 7]
2. 利用排序
原理: 排序后, 然后相邻元素比较
- distinct = (arr) =>{
- let arrSort = arr.sort();
- let _arr = [];
- for(let i = 0; i <arrSort.length; i++){
- if(arrSort[i] !== arrSort[i+1]){
- _arr.push(arrSort[i]);
- }
- }
- return _arr;
- }
- let arr = [2,1,3,5,1,2,4];distinct(arr);
- =>[1, 2, 3, 4, 5]
3. 利用 indexof,forEach
原理: 利用 forEach 的三个参数和 indexOf() 的第二个参数, 在数组中检测该元素后方是否有与该元素相同的元素.
- distinct = (arr) =>{
- let _arr = [];
- arr.forEach((item, index, arr) => {
- var bool = arr.indexOf(item,index+1);
- if(bool === -1){
- _arr.push(item);
- }
- })
- return _arr;
- }
- let arr = [2,1,3,5,1,2,4];
- distinct(arr);
- => [3, 5, 1, 2, 4] //1 是后面的 1,2 也是后出现的 2.
4. 利用 splice
原理: splice() 删除元素, 会改变原数组.
- distinct = (arr) =>{
- let 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;
- }
- let arr = [2,1,3,5,1,2,4];
- distinct(arr);
- =>[2, 1, 3, 5, 4]
来源: https://juejin.im/post/5ad473286fb9a028e25e0874