回调和操作数组但返回 undefined

Callbacks & manipulating arrays but getting undefined back

练习回调和高阶函数&在网上找到这个问题。

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) 时,控制台 returns "undefined" 所以我猜它必须做 w/ x 的值不是数组。我可以看到数学计算是正确的,因为当我将 "return a + b" 更改为 "console.log(a + b)" 时,我得到了正确的数字,但不是数组形式。谁能指出我正确的方向?

您正在调用 callback,但您忽略了由它编辑的值 return。您应该将所有值累积到一个数组中,并且您应该 return 来自 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长度的循环将不会总是正确的。所以,您可能想要

  1. 取两个数组中长度最小的,忽略较长数组中的元素

  2. 或为较短数组的元素使用默认值。

如果选择第一种方法,那么只需要调整循环条件,像这样

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]的值returns undefined(如果在数组中没有找到索引,undefined会是return ed),意思是array1array2短,所以会使用默认值0