回调&操纵数组但返回未定义

时间:2015-07-04 10:00:27

标签: javascript arrays callback

练习回调&更高阶的功能&在网上发现了这个问题。

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)”时,我得到正确的数字,但不是数组形式。有人能指出我正确的方向吗?

1 个答案:

答案 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的长度运行循环将始终不正确。所以,你可能想要

  1. 使用两个数组的最小长度并忽略较长数组中的元素

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

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

    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