繁体   English   中英

我试图通过编写回调来使“合并功能”工作。

[英]I'm trying to make the “merge function” work by writing a Callback.

我认为我对回调的理解是相当绿色的。 但到目前为止,我的功能只是将每个数组中的第一个索引添加到一起。

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);

当您使用回调时,代码流现在通过回调而不返回和变量赋值。 我在您的代码中看到了各种用法,我不清楚您的代码正在尝试做什么。 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)来确保结果数组与最长的输入数组一样长。 那里有一点复杂,但我想指出一个潜在的问题。

你的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);

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

看起来你想使用回调来完成合并工作,就像使用.filter.sort of Array一样。 如果是这种情况,您可以在合并函数中执行工作,也可以在回调函数中执行这两项操作。

这意味着您可以在merge函数中执行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]); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM