inject
inject(accumulator, iterator[, context]) -> accumulatedValue
根据参数 iterator
中定义的规则来累计值。首次迭代时,参数 accumulator
为初始值,迭代过程中,iterator
将处理过的值存放在 accumulator
中,并作为下次迭代的起始值,迭代完成后,返回处理过的 accumulator
。
该方法常用于构建数组、计数数值总和或平均值等。
译注:参数 iterator
是一个函数对象,Prototype 会传递三个参数给该对象,
第一个参数是需要累计的对象,即 accumulator
,第二个参数是 Enumerable
中的元素,第三个参数是元素的数字索引。
可选的 context
参数是 iterator
要绑定的对象,若设定该参数,iterator
中的 this
关键字将指向 context
对象。
样例
$R(1,10).inject(0, function(acc, n) {
return acc + n;
})
// -> 55 (1 到 10 的总和)
$R(2,5).inject(1, function(acc, n) {
return acc * n;
})
// -> 120 (5 的阶乘)
['hello', 'world', 'this', 'is', 'nice'].inject(
[],
function(array, value, index) {
if (0 == index % 2)
array.push(value);
return array;
}
)
// -> ['hello', 'this', 'nice']
// 注意下面的代码对结果集的引用:
var array1 = [];
var array2 = [1, 2, 3].inject(array1, function(array, value) {
array.push(value * value);
return array;
});
array2 // -> [1, 4, 9]
array1 // -> [1, 4, 9]
array2.push(16);
array1 // -> [1, 4, 9, 16]
性能参考
在包含多个数组的集合上进行 inject
操作时,可以通过 JavaScript 的引用机制来避免数组复制时的巨大性能消耗(与
JavaScript 原生的 concat
方法相反,后者总是返回一个新的数组)。