我正在尝试通过编写回调来使 "merge function" 工作。
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);
您的 return 语句是您的函数 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);
当您使用回调时,您的代码流现在是通过回调而不是 return 和变量赋值。我在您的代码中看到混合用法,我不清楚您的代码试图做什么。 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)
来确保结果数组与最长的输入数组一样长。那里有点复杂,但我想指出一个潜在的问题。
您返回得太早了,循环的第一次迭代将结束函数调用。
看起来您想使用回调来完成合并工作,就像您使用 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]);
我认为我对回调的理解还很幼稚。但这是到目前为止的情况,我的功能只是将每个数组中的第一个索引加在一起。
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);
您的 return 语句是您的函数 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);
当您使用回调时,您的代码流现在是通过回调而不是 return 和变量赋值。我在您的代码中看到混合用法,我不清楚您的代码试图做什么。 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)
来确保结果数组与最长的输入数组一样长。那里有点复杂,但我想指出一个潜在的问题。
您返回得太早了,循环的第一次迭代将结束函数调用。
看起来您想使用回调来完成合并工作,就像您使用 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]);