2015-06-08 13 views
3

我認爲我對回調的理解很綠。但這是迄今爲止,我的功能只是在每個陣列中添加第一個索引。我試圖通過編寫回調使「合併功能」工作。

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

回答

1

你回來得太早,通過循環的第一次迭代將結束函數調用。

它看起來像你想使用回調做合併工作,很像你會與.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]);

1

你的返回語句是你的函數返回每個數組的第一個索引之和的原因。它終止函數調用,永遠不會到達你的回調函數。這應該可以幫助你實現它。注意:有一千種方法可以實現你在這裏要做的事情。

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] 

走得更遠,我也將使用Math.max(array1.length, array2.length)for循環,以保證結果數組與最長輸入數組一樣長。那裏有一點複雜,但我想指出一個潛在的問題。

+0

謝謝!我對JavaScript非常陌生當談到編寫這些類型的函數時,我經常會感到頭疼。 math.max方法似乎也是需要研究的東西!我非常欣賞這個輸入! –