filter/map/reduce
1.filter(过滤)
filter(function, itetable)
filter也是一个常用的操作,它用于把Array的某些元素过滤掉,然后返回剩下的元素。
和map()类似,Array的filter()也接收一个函数。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。
回调函数
filter()接收的回调函数,其实可以有多个参数。通常我们仅使用第一个参数,表示Array的某个元素。回调函数还可以接收另外两个参数,表示元素的位置和数组本身:
// filter中的回调函数有一个要求: 必须返回一个boolean值
// true: 当返回true时, 函数内部会自动将这次回调的n加入到新的数组中
// false: 当返回false时, 函数内部会过滤掉这次的n
const nums = [10, 20, 111, 222, 444, 40, 50]
let newNums = nums.filter(function (n) {
return n < 100 // 过滤条件
})
console.log(newNums); // 返回一个数组
2.map (处理)
map()方法定义在JavaScript的Array中,它返回一个新的数组,数组中的元素为原始数组调用函数处理后的值。
- 不会对空数组进行检测
- 不会改变原数组
参数说明:
function(currentValue, index, arr):必须。为一个函数,数组中的每个元素都会执行这个函数。其中函数参数:
- currentValue:必须。当前元素的的值。
- index:可选。当前元素的索引。
- arr:可选。当前元素属于的数组对象。
const nums = [10, 20, 111, 222, 444, 40, 50]
let new2Nums = newNums.map(function (n) { // 20
return n * 2
})
console.log(new2Nums);
3.reduce(汇总)
1.reduce(callback,initiaValue)会传入两个变量,回调函数(callback)和初始值(initValue)。
2.假设函数有个传入参数,prev和next,index和array。 Prev和next是你必须要了解的。
3.当没有传入初始值时,prev是从数组中第一个元素开始的,next是第二个函数。
4.但是当传入初始值(initiaValue)后,第一个prev将是initivalValue,next将是数组中的第一个元素
// reduce作用对数组中所有的内容进行汇总
const nums = [10, 20, 111, 222, 444, 40, 50]
let total = nums.reduce(function (preValue, n) {
return preValue + n
}, 0)
console.log(total);
// 第一次: preValue 0 n 20
// 第二次: preValue 20 n 40
// 第二次: preValue 60 n 80
// 第二次: preValue 140 n 100
// 240
// 统计一个数组中有多少个不重复的单词:
let arr = ["apple","orange","apple","orange","pear","orange"];
function getWordCnt(){
return arr.reduce(function(prev,next){
prev[next] = (prev[next] + 1) || 1;
console.log(prev);
return prev;
},{});
}
console.log(getWordCnt()); // VM3704:14 {apple: 2, orange: 3, pear: 1}