一、各自的介绍:
map:
map 用于遍历数组的每个元素,并在方法体内进行处理后,将处理后的结果进行返回,返回的结果会在新的数组上的对应旧数组上该元素的下标存储;如果不设置返回值,那么 新数组上与旧数组该元素相同下标中存储 null;即新数组和旧数组长度是一样的;
let tempArr1 = [1, 3, 5, 7];
let newTempArr1 = tempArr1.map(function (currentValue, index, arr) {
console.info('currentValue:', currentValue, 'index:', index, 'arr:', arr);
if (currentValue == 3) {
return;
}
return currentValue * currentValue;
});
// currentValue: 1 index: 0 arr: (4) [1, 3, 5, 7]
// currentValue: 3 index: 1 arr: (4) [1, 3, 5, 7]
// currentValue: 5 index: 2 arr: (4) [1, 3, 5, 7]
// currentValue: 7 index: 3 arr: (4) [1, 3, 5, 7]
console.info(JSON.stringify(tempArr1)); // [1,3,5,7]
console.info(JSON.stringify(newTempArr1)); // [1,null,25,49]
filter:
filter 用于遍历数组的每个元素,并在方法体内进行条件过滤后,将过滤后的结果,通过 boolean 类型来判断返回;如果符合条件的就返回 true,不符合条件就返回 false;返回 true 就会把旧数组上该下标存储的值加入到新的数组中;返回 false 就会过滤掉这个下标存储的值;
let tempArr2 = [1, 3, 5, 7];
let newTempArr2 = [];
newTempArr2 = tempArr2.filter(function (currentValue, index, arr) {
console.info('currentValue:', currentValue, 'index:', index, 'arr:', arr);
return currentValue != 1;
});
// currentValue: 1 index: 0 arr: Array(4)
// currentValue: 3 index: 1 arr: Array(4)
// currentValue: 5 index: 2 arr: Array(4)
// currentValue: 7 index: 3 arr: Array(4)
console.info(JSON.stringify(tempArr2)); // [1,3,5,7]
console.info(JSON.stringify(newTempArr2)); // [3,5,7]
reduce:
reduce((previousValue, currentValue, currentIndex, array) => { /* ... */ }, initialValue)
reduce 方法中有两个参数:
- callbackFn (回调函数,里面有四个参数):
- previousValue:上一次调用 callbackFn 时的返回值;在第一次调用时,若指定了初始值 initialValue,那么它的值就是 initialValue,否则为数组索引为 0 的元素 array[0];
- currentValue:数组中正在处理的元素;在第一次调用时,若指定了初始值 initialValue,那么它的值为数组索引为 0 的元素 array[0],否则为 array[1];
- currentIndex:数组中正在处理的元素的索引;如果制订了初始值 initialValue,则其实索引号为 0,否则从索引 1 起始;
- array:用于遍历的数组;
- initialValue (非必填):
- 作为第一次调用 callbackFn 函数时参数 previousValue 的值;若指定了初始值 initialValue,则 currentValue 则将使用数组的第一个元素;否则 previousValue 将使用数组第一个元素,而 currentValue 将使用数组的第二个元素;
reduce 用于遍历数组的每个元素,并会把上一次处理返回值放到此次处理的方法体中,可以将数组中的每个元素从前往后互动起来处理;如果是第一个元素,那么 便从第二个元素开始;
let tempArr3 = [1,3,5,7];
let newTempArr3 = [];
newTempArr3 = tempArr3.reduce(function(previousValue, currentValue, index, arr) {
console.info('previousValue:', previousValue,'currentValue:', currentValue, 'index:', index, 'arr:', arr);
return previousValue + currentValue;
});
// previousValue: 1 currentValue: 3 index: 1 arr: (4) [1, 3, 5, 7]
// previousValue: 4 currentValue: 5 index: 2 arr: (4) [1, 3, 5, 7]
// previousValue: 9 currentValue: 7 index: 3 arr: (4) [1, 3, 5, 7]
console.info(JSON.stringify(tempArr3)); // [1,3,5,7]
console.info(JSON.stringify(newTempArr3)); // 16
二、异同:
1、相同点:
- 都不会对原有的数组造成影响;
- 都返回一个操纵后的新值;
- map 和 filter 的方法体内的入参都相同,reduce 方法体内 多了一个 previousValue,其他部分相同;
2、不同点:
- map 在对数组所有元素进行遍历的情况下,对每个元素进行操作后,并在对应下标下存储返回后的数值(未返回则未undefined),返回一个与旧数组长度相同的新数组;
- filter 在对数组所有元素进行遍历的情况下,对每个元素进行方法体内的条件过滤,满足条件的返回 true,并塞入到新数组中,不满足的则返回 false,不移入新数组中;
- reduce 在对数组所有元素进行遍历的情况下,能够记录上一个元素操作后的返回值,并在方法体内进行操作,最终返回一个操作后的一个值;