js中的map,filter,reduce

本文详细介绍了JavaScript中map、filter和reduce这三个数组操作方法。map用于创建新数组,对原数组每个元素进行变换;filter生成新数组,只包含回调函数返回值为true的元素;reduce则将数组元素通过回调函数转化为单一值。通过实例解释了它们的使用方法及潜在陷阱,如parseInt的radix参数和reduce的累加器概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值