携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情
数组的遍历方法(续)
上一节我们说到用foeEach()通过传递三个参数(修改对象属性)可以改变数组,但是当我们修改整个对象时,数组并不会发生变化,这就是一般情况,如:
var student = [{ name: '张三', sex: 'boy', heavy: '60' }, { name: '李四', sex: 'girl', heavy: '50' }];
//修改整个对象
var l1 = student.forEach(function (content) {
content = {
name: '王五',
sex: 'boy',
heavy: '100',
};
});
console.log(JSON.stringify(student));
所以同样,如果我们使用forEach()方法只是给function函数传递一个content参数的话,也并不会改变原数组,要想修改,则需要传递三个参数修改其属性。
那我们想要遍历数组的时候,是应该选择forEach()还是map()呢? 实际上我更建议用map()方法,因为map()使用起来更简单明了,既能够返回新数组不改变原数组,也能够修改原数组中的属性,而forEach()相比之下会更麻烦,而且还易出错,当然,同样也是修改其属性。
reduce()
初看这个方法,reduce意思是减少,实际上这个方法跟减少毫无关系,我们遍历数组也可以用它,它的作用在于使数组中的数组元素从左到右挨个经过回调函数加工,最后返回值是遍历了一遍数组后,回调函数返回的累计处理的结果,这个方法的参数也比较多,其中常用的就是previousValue和currentValue还有initialValue
其中:
- previousValue: 上一次回调函数的结果
- currentValue: 将要处理的元素
- initialValue: 初始化值
如:
例1:
//字符串拼接
var str1 = ['I', 'L', 'o', 'v', 'e', 'Y', 'o', 'u', '!'];
var str2 = str1.reduce(function (pre, cur) {
return pre + cur;
});
console.log(str2);
例2:
//计算结果
var array1 = [1, 3, 6, 4, 8, 2, 0, 8, 9];
var result = array1.reduce(function (pre, cur) {
return pre + cur;
}, 100);
console.log(result);//141
有人注意到,为什么例1没有previousValue和initialValue也能实现,实际上程序在运作的时候,如果没有这两个参数,会自动将数组第一个元素和第二个元素分别传给pre和cur。