Reduce函数采用未定义的初始值
Reduce function to take an undefined initial value
我想创建一个执行以下操作的函数(归约):
其中:
var collection = [1, 2, 3];
和
function iterator(total, element) {
return total + element;
};
如果 initial
定义为 3
:
reduce(collection, iterator, 3)
会这样做:
3 + 1
4 + 2
6 + 3 = 9
如果 initial
是 undefined
:
reduce(collection, iterator)
会这样做:
1 + 2
3 + 3 = 6
这是我的代码:
var reduce = function(collection, iterator, initial) {
if (initial === undefined) {
var total = 0;
} else {
var total = initial;
}
each(collection, function(element) {
total = iterator(total, element);
});
return total;
}
它有效,但你可以看到我已经硬编码 total = 0
,但我希望此代码在其他情况下有效(例如,乘法,我不希望 0 使整个产品 0).
这就是我的实现方式:
alert(reduce([1,2,3], add, 3)); // 9
alert(reduce([1,2,3], add)); // 6
function add(a, b) {
return a + b;
}
function reduce(array, iterator, initial) {
var length = array.length;
var index = 0;
if (arguments.length < 3) {
if (length > 0) var result = array[index++]; // Note 1
else throw new Error("Reduce of empty array with no initial value");
} else var result = initial;
while (index < length) result = iterator(result, array[index++]);
return result;
}
代码很容易解释。尽管如此,它是这样工作的,如果传递的参数数量少于 3,则意味着没有给出 initial
。因此我们将 result
设置为 array[0]
并递增 index
。如果 array
为空,那么我们将抛出一个错误。否则,我们将 result
设置为传递给函数的 initial
值。其他一切正常。
注1:之所以不修改initial
(即写成initial = array[index++]
)是因为如果我们在其中使用arguments
一个函数,并且还修改了函数的参数,那么函数将在 V8 中 not be optimized。因此,它会执行得更慢。
希望对您有所帮助。
我想创建一个执行以下操作的函数(归约):
其中:
var collection = [1, 2, 3];
和
function iterator(total, element) {
return total + element;
};
如果 initial
定义为 3
:
reduce(collection, iterator, 3)
会这样做:
3 + 1
4 + 2
6 + 3 = 9
如果 initial
是 undefined
:
reduce(collection, iterator)
会这样做:
1 + 2
3 + 3 = 6
这是我的代码:
var reduce = function(collection, iterator, initial) {
if (initial === undefined) {
var total = 0;
} else {
var total = initial;
}
each(collection, function(element) {
total = iterator(total, element);
});
return total;
}
它有效,但你可以看到我已经硬编码 total = 0
,但我希望此代码在其他情况下有效(例如,乘法,我不希望 0 使整个产品 0).
这就是我的实现方式:
alert(reduce([1,2,3], add, 3)); // 9
alert(reduce([1,2,3], add)); // 6
function add(a, b) {
return a + b;
}
function reduce(array, iterator, initial) {
var length = array.length;
var index = 0;
if (arguments.length < 3) {
if (length > 0) var result = array[index++]; // Note 1
else throw new Error("Reduce of empty array with no initial value");
} else var result = initial;
while (index < length) result = iterator(result, array[index++]);
return result;
}
代码很容易解释。尽管如此,它是这样工作的,如果传递的参数数量少于 3,则意味着没有给出 initial
。因此我们将 result
设置为 array[0]
并递增 index
。如果 array
为空,那么我们将抛出一个错误。否则,我们将 result
设置为传递给函数的 initial
值。其他一切正常。
注1:之所以不修改initial
(即写成initial = array[index++]
)是因为如果我们在其中使用arguments
一个函数,并且还修改了函数的参数,那么函数将在 V8 中 not be optimized。因此,它会执行得更慢。
希望对您有所帮助。