簡體   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