【问题标题】:I'm trying to make the "merge function" work by writing a Callback.我正在尝试通过编写回调来使“合并功能”工作。
【发布时间】:2015-08-23 07:32:00
【问题描述】:

我认为我对回调的理解是非常绿色的。但这就是迄今为止所拥有的,我的功能只是将每个数组中的第一个索引加在一起。

var merge = function(array1, array2, callback){  
  for (var i = 0; i < array1.length; i++) {
   return array1[i] + array2[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);

【问题讨论】:

    标签: javascript function callback add indices


    【解决方案1】:

    您的 return 语句是您的函数仅返回每个数组的第一个索引之和的原因。它终止函数调用并且永远不会到达您的回调调用。这应该可以帮助您使其正常工作。注意:有一千种方法可以实现您在此处尝试做的事情。

    var merge = function(array1, array2, callback){ 
      var sum=0; 
      for (var i = 0; i < array1.length; i++) { 
        sum = sum + callback(array1[i],array2[i]); 
      } 
      return sum;
    }; 
    var x = merge([1, 2, 3, 4], [5, 6, 7, 8], 
               function(a, b){ return a + b; }); 
    console.log(x);
    

    【讨论】:

      【解决方案2】:

      当您使用回调时,您的代码流程现在是通过回调而不是返回和变量赋值。我在您的代码中看到混合使用,我不清楚您的代码试图做什么。 for 循环内部的return 将在调用回调之前终止合并函数。

      我可能会将您的代码调整为:

      var merge = function(array1, array2, callback){  
        var result = [];
        for (var i = 0; i < array1.length; i++) {
         result[i] = array1[i] + array2[i];
        };
        callback(result);
      };
      
      var x = merge([1, 2, 3, 4], [5, 6, 7, 8], function(merged) {
          console.log(merged);
      });
      

      这会将这个结果记录到控制台:

      [6, 8, 10, 12]
      

      为了更进一步,我还将在for 循环中使用Math.max(array1.length, array2.length) 来确保结果数组与最长输入数组一样长。那里有点复杂,但我想指出一个潜在的问题。

      【讨论】:

      • 谢谢!我对 JavaScript 太陌生了,在编写这些类型的函数时经常会头晕目眩。 math.max 方法似乎也值得研究!我非常感谢您的意见!
      【解决方案3】:

      您返回得太早了,循环的第一次迭代将结束函数调用。

      您似乎想使用回调来完成合并工作,就像您使用数组的.filter.sort 一样。如果是这种情况,您可以在合并函数或回调中完成工作,而不是两者都做。

      意味着您要么在合并函数中执行array1[i]+array2[i],将每个结果添加到新数组中,要么将参数传递给回调并将回调中的每个结果放入新数组中。

      var merge = function(array1, array2, callback){  
        //test to make sure arrays are same length
        if(array1.length != array2.length){
           throw new Error('Arrays are of different lengths'); 
        }
        var out = [];
        for (var i = 0; i < array1.length; i++) {
          if(callback){
            out.push( callback(array1[i],array2[i]) );
          } else {
            out.push( array1[i] + array2[i] );
          }
        }
        return out;
      };
      
      var x = merge([1, 2, 3, 4], [5, 6, 7, 8], function(a, b){  
        return a + b;
      });
      var x2 = merge([1, 2, 3, 4], [5, 6, 7, 8]);
      
      document.body.innerHTML = x.toString();
      document.body.innerHTML += '<br>'+x2.toString();
      
      //will cause the error to be thrown
      var x2 = merge([1, 2, 3, 4], [6, 7, 8]);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多