forEach,map
JavaScript中的forEach
和map
都是数组方法,它们的功能类似,但是在用法和返回值上有一些区别。
forEach
方法是遍历数组的每一个元素,对每个元素执行指定的操作。它不会返回任何值,只是在每个元素上执行指定的操作。该方法接受一个回调函数作为参数,这个回调函数会在遍历过程中执行,并且它接收三个参数:当前元素,当前索引和原数组。例如:
let arr = [1, 2, 3];
arr.forEach(function(item, index, array) {
console.log(item, index, array);
});
上面的代码会输出:
1 0 [1, 2, 3]
2 1 [1, 2, 3]
3 2 [1, 2, 3]
map
方法也是遍历数组的每一个元素,对每个元素执行指定的操作,并将操作后的结果存储在一个新数组中。该方法接受一个回调函数作为参数,这个回调函数会在遍历过程中执行,并且它接收三个参数:当前元素,当前索引和原数组。例如:
let arr = [1, 2, 3];
let newArr = arr.map(function(item, index, array) {
return item * 2;
});
console.log(newArr); // [2, 4, 6]
上面的代码将原数组中的每个元素乘以2,并将结果存储在一个新数组中。
总之,forEach
方法用于对数组中的每个元素进行操作,而map
方法用于对数组中的每个元素进行操作并返回操作后的结果。
reduce
JavaScript中的reduce()是一种数组方法,它允许对数组的每个元素执行一个指定的函数,并将结果缩减为单个值。
reduce()函数接受两个参数:回调函数和可选的初始值。回调函数接受四个参数:累积值、当前值、当前索引和数组本身。
reduce()的基本语法如下:
array.reduce(callback, initialValue)
其中,callback函数接受四个参数:
function callback(accumulator, currentValue, currentIndex, array) {
// ...
}
- accumulator: 累积器,保存reduce()的返回值。回调函数在每次执行后返回的结果都将累加到这个值中。
- currentValue: 当前值,每次迭代中处理的数组元素。
- currentIndex: 当前索引,每次迭代中处理的数组元素的索引。
- array: 原始数组,reduce()函数被调用的数组。
reduce()函数的执行过程如下:
- 如果提供了initialValue,则accumulator将初始化为这个值,否则将初始化为数组的第一个元素。
- 对数组的每个元素执行回调函数,并将返回值添加到accumulator中。
- 在所有元素都处理完毕后,reduce()函数将返回accumulator的最终值。
以下是一个使用reduce()函数计算数组元素之和的示例:
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
console.log(sum); // 输出 15
在上面的示例中,初始值为0,累积器accumulator从0开始累加每个元素的值,最终得到数组元素之和15。
reduce()函数也可以用于计算其他聚合函数,例如最大值、最小值和平均值等。它还可以用于操作对象数组,例如将对象数组映射到另一个值数组,或根据对象属性对数组进行分组等操作。
手写reduce()
//arr:要累积的数组。
//callback:每一次累积执行的回调函数。
//init:初始值,可选。
function myReduce(arr, callback, init){
//如果没有传入初始值,则使用数组的第一项作为初始值,从第二项开始遍历。
let num = init == undefined? arr[0]: init;
//如果传入了初始值,则从数组的第一项开始遍历。
let i = init == undefined? 1: 0
//遍历数组,使用回调函数处理每一项,回调函数接收三个参数:上一次累积的结果,当前项,当前项的索引。
for (; i< arr.length; i++){
//将处理后的结果作为下一次回调函数的第一个参数,继续累积计算。
num = callback(num,arr[i],i)
}
//遍历完成后,返回最终的累积结果。
return num
}
function fn(prev,cur, index){
return prev + cur
}
var arr = [2,3,4,5]
var b = myReduce(arr, fn,10)
console.log(b) // 24