练习回调和高阶函数并在网上发现了这个问题。
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) 时,控制台返回“未定义”,所以我猜测它必须与 x 的值不是数组有关。我可以看到数学计算是正确的,因为当我将“return a + b”更改为“console.log(a + b)”时,我得到了正确的数字,但不是数组形式。谁能指出我正确的方向?
最佳答案
您正在调用回调
,但忽略了它返回的值。您应该累积数组中的所有值,并且应该从 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
。
关于javascript - 回调和操作数组但返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31219310/