我试图制作"合并功能"通过写回调来工作。

时间:2015-06-08 17:49:49

标签: javascript function callback add indices

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

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

3 个答案:

答案 0 :(得分: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]

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

答案 1 :(得分: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 :(得分:1)

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

看起来您希望使用回调来执行合并工作,就像使用Array的.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]);