练习回调&更高阶的功能&在网上发现了这个问题。
var merge = function(array1, array2, callback){
//your code here.
}
var x = merge([1, 2, 3, 4], [5, 6, 7, 8], function(a, b){
return a + b;
});
//x should now equal [6, 8, 10, 12].
这是我对这个问题的看法。
var merge = function(array1, array2, callback){
for(var i = 0; i < array1.length; i++) {
callback(array1[i], array2[i]);
}
}
var x = merge([1, 2, 3, 4], [5, 6, 7, 8], function(a, b){
return a + b;
});
当我在console.log(x)时,控制台返回“undefined”,所以我猜它必须做x的值不是数组。我可以看到数学正在正确完成,因为当我将“返回a + b”更改为“console.log(a + b)”时,我得到正确的数字,但不是数组形式。有人能指出我正确的方向吗?
答案 0 :(得分:2)
您正在调用callback
,但忽略了它返回的值。您应该累积数组中的所有值,并且应该从merge
返回数组。
例如,
function merge(array1, array2, callback) {
// Define an array object to accumulate the results from `callback`
var result = [];
for (var i = 0; i < array1.length; i++) {
// Accumulate the result of `callback` in `result` array
result.push(callback(array1[i], array2[i]));
}
// Return the `result` array
return result;
}
注意:如果数组的大小不同,那么根据array1
的长度运行循环将始终不正确。所以,你可能想要
使用两个数组的最小长度并忽略较长数组中的元素
或使用较短数组元素的默认值。
如果您选择使用第一种方法,那么您只需要调整循环条件,就像这样
var minLen = Math.min(array1.length, array2.length);
for (var i = 0; i < minLen; i++) {
...
如果您选择使用第二种方法,那么您需要运行到最多两个数组并使用默认值,例如
var maxLen = Math.max(array1.length, array2.length);
for (var i = 0; i < maxLen; i++) {
result.push(callback(array1[i] || 0, array2[i] || 0));
}
此处,如果array1[i]
的值返回undefined
(如果在数组中找不到索引,则会返回undefined
),这意味着array1
是短于array2
,因此将使用默认值0
。