2015-06-08 5 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

При использовании обратного вызова, поток кода теперь через обратные вызовы не возвращаются и присваивание переменной. Я вижу смесь использования в вашем коде, и мне не ясно, что ваш код пытается сделать. return внутри цикла for прекратит функцию слияния до вызова обратного вызова.

я мог бы адаптировать свой код к этому:

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 кажется чем-то, что нужно изучать! Я очень ценю вход! –

 Смежные вопросы

  • Нет связанных вопросов^_^