map
map 作用是生成一个新数组,遍历原数组,将每个元素拿出来做一些变换然后放入到新的数组中。
let arr = [1,2,3]
let newArr = arr.map(item => item + 1)
console.log(newArr)//[2,3,4]
另外 map 的回调函数接受三个参数,分别是当前索引元素,索引,原数组。
MDN上的案例
["1", "2", "3"].map(parseInt);
我们期望输出 [1, 2, 3], 而实际结果是 [1, NaN, NaN].
parseInt() 函数将给定的字符串以指定基数(radix/base)解析成为整数。
就是 你想把string当成radix进制数解析成10进制
第一轮遍历 parseInt(‘1’, 0) -> 1
第二轮遍历 parseInt(‘2’, 1) -> NaN
第三轮遍历 parseInt(‘3’, 2) -> NaN
radix传入0时会把1当成是10进制数,所以“1”成功了。
radix传入1时…没有1进制数,所以不可能转换成功,返回NaN
radix传入2时,"3"不能当作2进制数处理所以也返回NaN
filter
filter 的作用也是生成一个新数组,在遍历数组的时候将返回值为 true 的元素放入新数组,我们可以利用这个函数删除一些不需要的元素。
let arr = [1,2,3,4,5,6,7,8,9]
let newArr = arr.filter(item => item % 2 == 0)
console.log(newArr) // [2, 4, 6, 8]
和 map 一样,filter 的回调函数也接受三个参数,用处也相同。
reduce
reduce 可以将数组中的元素通过回调函数最终转换为一个值。
参数一:为回调函数接受四个参数,分别为累计值、当前元素、当前索引、原数组
- accumulator 累计器
- currentValue 当前值
- currentIndex 当前索引
- array 数组
参数二:作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。
let arr = [1, 2, 3]
let sum = arr.reduce((acc, current) => acc + current, 0)
// 1 + 2 + 3
console.log(sum) // 6
在一次执行回调函数时,当前值和初始值相加得出结果 1,该结果会在第二次执行回调函数时当做第一个参数传入
其他应用:
计算每个元素出现的次数
var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
var countedNames = names.reduce(function (allNames, name) {
// allNames 初始值为{}
if (name in allNames) { // 当前元素是allNames对象的属性表示遍历过 次数+1
allNames[name]++;
}
else { // 当前元素不存在 设置为allNames对象的属性 第一次遍历:1
allNames[name] = 1;
}
return allNames; // 返回统计的对象 当做累计器
}, {});
console.log(countedNames); // {Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
数组去重
let arr = [1, 2, 3, 4, 4, 1, 2, 5]
let newArr = arr.reduce((pre, cur) => {
// pre初始值为[]
if (!pre.includes(cur)) { // 当前元素不在数组中就加进去
pre.push(cur);
}
return pre;
}, [])
console.log(newArr);// [1, 2, 3, 4, 5]
将二维数组转化为一维
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(
// 合并数组
( acc, cur ) => acc.concat(cur),
[]
);
console.log(flattened); // (6) [0, 1, 2, 3, 4, 5]
求对象里的属性和
var result = [
{
subject: 'math',
score: 10
},
{
subject: 'chinese',
score: 20
},
{
subject: 'english',
score: 30
}
];
var sum = result.reduce(function(prev, cur) {
return cur.score + prev;
}, 0);
console.log(sum) //60