Enumerable.inject - Prototype JavaScript 框架

Xunxin Prototype API

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 方法相反,后者总是返回一个新的数组)。