Javascript TypeError:回调不是函数-如何修复此问题?

Javascript TypeError:回调不是函数-如何修复此问题?,javascript,object,callback,Javascript,Object,Callback,我该如何解决这个问题 问题是: 实现一个函数“mapById”,当给定一个对象数组时,该函数返回一个对象,其中键是输入对象的ID,值是相应的输入对象 例如: mapById([{id: 102, name: "Alice"}, {id: 205, name: "Bob", title: "Dr."}, {id: 592, name: "Claire", age: 32}]); 返回: { 102: {id: 102, name: "Alice"}, 205: {

我该如何解决这个问题

问题是:

实现一个函数“mapById”,当给定一个对象数组时,该函数返回一个对象,其中键是输入对象的ID,值是相应的输入对象

例如:

mapById([{id: 102, name: "Alice"},
        {id: 205, name: "Bob", title: "Dr."},
        {id: 592, name: "Claire", age: 32}]);
返回:

{
102: {id: 102, name: "Alice"},
205: {id: 205, name: "Bob", title: "Dr."},
592: {id: 592, name: "Claire", age: 32}
}
var key=回调(项); ^ TypeError:回调不是函数

function mapById(list, callback) {
    var obj = {};
    list.forEach(function(item) {
        var key = callback(item);
        if (obj[key]) {
            obj[key] = obj[key].concat(item);
        } else {
            obj[key] = [item];
        }
    });
    return obj;
}

console.log(mapById(input));

你这样调用这个函数

mapById(my_list, function(){
    return "my_key"
});
您得到的错误表明您要么传递了错误的参数作为第二个参数,要么根本没有传递第二个参数

然而,术语回调在这里没有意义。回调函数用于向调用方函数发出被调用函数已完成执行的信号


对于您的情况,我建议使用一个名称,如,
getKey
getKeyByListItem
等。

您这样调用此函数

mapById(my_list, function(){
    return "my_key"
});
您得到的错误表明您要么传递了错误的参数作为第二个参数,要么根本没有传递第二个参数

然而,术语回调在这里没有意义。回调函数用于向调用方函数发出被调用函数已完成执行的信号

对于您的情况,我建议使用一个名称,如,
getKey
getKeyByListItem
等。

问题: 您遇到的错误是,在定义函数时,您给了它两个参数:
list
callback

函数mapById(列表,回调){
但是,当调用函数时,只给它一个参数:
input

console.log(mapById(输入));
因此,当代码被执行并到达函数
var key=callback(item)的这一部分时它抛出异常,因为回调未定义,因为您没有传入第二个参数

解决方案: 有很多方法可以解决您的问题。一种解决方案是,当您第一次声明
mapById
时,只需在内部调用回调

然后move调用mapById时,将对象作为第二个参数返回的代码逻辑,当声明对象时,将对象作为第二个参数返回

例如

函数mapById(列表,回调){
var obj={};
返回回调(项目);
}
log(mapById(输入,函数(){
//逻辑就在这里
}));
注意我个人不会这样构造它,因为回调是不必要的,但我将向您展示如何使用回调来完成它。

问题: 您遇到的错误是,在定义函数时,您给了它两个参数:
list
callback

函数mapById(列表,回调){
但是,当调用函数时,只给它一个参数:
input

console.log(mapById(输入));
因此,当代码被执行并到达函数
var key=callback(item)的这一部分时它抛出异常,因为回调未定义,因为您没有传入第二个参数

解决方案: 有很多方法可以解决您的问题。一种解决方案是,当您第一次声明
mapById
时,只需在内部调用回调

然后move调用mapById时,将对象作为第二个参数返回的代码逻辑,当声明对象时,将对象作为第二个参数返回

例如

函数mapById(列表,回调){
var obj={};
返回回调(项目);
}
log(mapById(输入,函数(){
//逻辑就在这里
}));

注意,我个人不会这样构造它,因为回调是不必要的,但我将向您展示如何使用回调来完成它。

您在哪里调用
mapById
?您可以通过在调用者中提供适当的函数来修复它。格式化您的代码,我想你会发现这个问题的。你能给我们发送你调用mapById函数的部分吗?我正在关闭这个线程并用这个替换它,你在哪里调用
mapById
?你可以通过在调用者中提供适当的函数来修复它。格式化你的代码,我想你会发现这个问题的。你能给我们发送你调用mapById函数的片段吗?我正在关闭这个线程并用它替换它。你介意解释一下在没有回调的情况下如何构造代码吗?你介意解释一下在没有回调的情况下如何构造代码吗?