小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
数组去重
1、Set
let arr = [1,2,3,4,3,1] console.log(Array.from(new Set(arr))); // [1,2,3,4] console.log([...new Set(arr)]);
2、reduce
1)reduce() 方法接收一个回调函数作为第一个参数,回调函数又接受四个参数,分别是:
- previousValue => 初始值或上一次回调函数叠加的值;
- currentValue => 本次回调(循环)将要执行的值;
- index =>“currentValue”的索引值;
- arr => 数组本身;
reduce()方法返回的是最后一次调用回调函数的返回值;
let arr = [1,2,3,4,5,6]; arr = arr.reduce((previousValue, currentValue) => { return previousValue + currentValue; //返回的是最后一次调用回调函数的值,15+6; }) console.log(arr); // 21
上面代码的最终结果就是1+2+3+4+5+6 = 21;
2)reduce还可以接收第二参数initialValue,用来声明回调函数(第一个参数)的previousValue的类型和初始值;
let arr = [1,2,3,4,5,6];
arr = arr.reduce((previousValue,currentValue) => { return previousValue + currentValue; },0)
//指定cur的类型为Number并且初始值为0,当设为1时,最终打印的值为22 console.log(arr); // 21
注意:
如果设置了initialValue的值,第一次执行回调函数的previousValue的值等于initialValue,此时查看当前索引(index)为0;但如果不设置initialValue的值,previousValue的值为数组的第一项,并且索引值(index)为1;也就是说,不设置初始值的话reduce()方法实际是从第二次循环开始的!
let arr = [ { id: 1 }, { id: 2, pid: 1 }, { id: 3, pid: 2 }, { id: 4, pid: 1 }, { id: 5, pid: 3 }, { id: 6, pid: 2 }, { id: 6, pid: 2 }, { id: 2, pid: 1 } ]
let obj = {};
arr= arr.reduce((cur,next) => { obj[next.id] ? "" : obj[next.id] = true && cur.push(next); return cur; },[])
//设置cur默认类型为数组,并且初始值为空的数组 console.log(arr);