使用 JavaScript 中的 reduce() 和 reduceRight() 方法可以对数组元素的值进行迭代(或者说累加)。
JavaScript 中的 reduce() 方法可对数组中的所有元素调用指定的回调函数。该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供。具体用法如下:
参数说明:
recude() 方法的返回值是通过最后一次调用回调函数获得的累积结果。
如果提供了参数 initialVaule,则 reduce() 方法会对数组中的每个元素调用一次 callbackfn 函数(按升序索引顺序);如果为提供 initialVaule,则 reduce() 方法会对从第 2 个元素开始的每个元素调用 callbackfn 函数。
回调函数的返回值在下一次调用回调函数时作为 previousValue 参数提供。最后一次调用回调函数获得的返回值为 recude() 方法的返回值。该方法不为数组中缺少的元素调用该回调函数。
回调函数的语法如下:
回调函数参数说明:
在第一次调用回调函数时,作为参数提供的值取决于 reduce() 方法是否具有 initialValue 参数。如果向 recude() 方法提供 initialValue,则 previousValue 参数为 initialValue,currentValue 参数是数组中第 1 个元素的值。
如果未提供 initialValue,则 previousValue 参数是数组中的第 1 个元素的值,currentValue 参数是数组中的第 2 个元素的值。
下面示例演示将数组值连接成字符串,各个值用::分隔开。由于未向 recude() 方法提供初始值,第一次调用回调函数时会将“abc”作为 previousValue 参数,并将“def”作为 currentValue参数。
function f(pre, curr) {
return pre + ": :" + curr;
}
var a = ["abc", "def", 123, 456];
var r = a.recude(f);
console.log(r); //abc::def::123::456
下面示例向数组中添加值。currentIndex 和 array 参数用于回调函数。
function f(pre, curr, i, array) {
var e = (array.length - 1) - i;
var d = curr * Math.pow(10, e);
return pre + d;
}
var a = [4,1,2,5];
var r = a.recude(f, 0);
console.log(r); //4125
下面示例获取一个数组,该数组仅包含另一个数组中的介于 1 和 10 之间的值,提供给 recude() 方法的初始值是一个空数组。
function f(pre, curr) {
var next;
if (curr >= 1 && curr <= 10) {
next = pre.concat(curr);
} else {
next = pre;
}
return next;
}
var a1 = [20,1,-5,6,50,3];
var a = new Array();
var r = a1.recude(f, a);
console.log(r); //1,6,3
JavaScript 中的 recudeRight() 方法可从右向左对数组中的所有元素调用指定的回调函数。该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供。具体用法如下:
该方法的语法和用法与 reduce() 方法大概相同,唯一不同的是,它是从数组右侧开始调用回调函数。如果提供了 initialValue,则 reduceRight() 方法会按降序索引顺序对数组中的每个元素调用一次 callbackfn 函数。如果未提供 initialValue,则 reduceRight() 方法会按降序索引顺序对每个元素(从倒数第 2 个元素开始)调用 callbackfn 函数。
下面示例使用 reduceRight() 方法,以::为分隔符,从右到左把数组元素的值连接在一起。
function f (pre, curr) {
return pre + "::" + curr;
}
var a = ["abc", "def", 123, 456];
var r = a.recudeRight(f);
console.log(r); //456::123::def::abc