javascript - 回调和操作数组但返回未定义

标签 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) 时,控制台返回“未定义”,所以我猜测它必须与 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 的长度运行循环并不总是正确的。所以,您可能想要

  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]的值返回undefined(如果在数组中找不到索引,则undefined将是返回),这意味着 array1array2 短,因此将使用默认值 0

关于javascript - 回调和操作数组但返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31219310/

相关文章:

javascript - 优化 json 中 bool 数组的大小

sql - 数组 (UUID[ ]) 是否打破 1NF?

c++ - C++结构中的回调

javascript - 谷歌地图平移地球的 'edge'

javascript - CSS transition 不同的行为取决于浏览器类型

javascript - 我需要为需要 1、2、3 或 4 位数字输入的输入创建一个正则表达式 - 但不会只接受 "0"

jquery - 从blur()调用实际函数

javascript - 如何使用 jQuery 在不同时间淡入图像

c - 嵌套数组的初始化?

javascript - 等待 json 在 javascript 中完成