Javascript 我是否以错误的方式使用了reduce方法?
在这个问题中,我试图对每个对象的数组中的值求和 我预计产量为 [{姓名:鲍勃,分数:[75]},{姓名:比尔,分数:[95] },{姓名:查理,分数:[95]}] O/p: TypeError:customerArr[i].scores.reduce不是一个函数Javascript 我是否以错误的方式使用了reduce方法?,javascript,javascript-objects,reduce,Javascript,Javascript Objects,Reduce,在这个问题中,我试图对每个对象的数组中的值求和 我预计产量为 [{姓名:鲍勃,分数:[75]},{姓名:比尔,分数:[95] },{姓名:查理,分数:[95]}] O/p: TypeError:customerArr[i].scores.reduce不是一个函数 传递与第二个和第三个参数相同的对象 function winner(...customers) { customers.forEach((customer) => { customer.scores = custome
传递与第二个和第三个参数相同的对象
function winner(...customers) {
customers.forEach((customer) => {
customer.scores = customer.scores.reduce(function(total, score) {
return total + score;
}, 0);
});
return customers;
}
var c1 = {
"name": "Bob",
"scores": [10, 65]
}
var c2 = {
"name": "Bill",
"scores": [90, 5]
}
var c3 = {
"name": "Charlie",
"scores": [40, 55]
};
console.log(winner(c1, c2, c3)); // <-- (c1, c2, c2) => (c1, c2, c3);
您的对象发生了变异,您在winner函数中放置了c2对象两次 所以c2第一次在reduce函数中是:
{
"name": "Bill",
"scores": [90, 5]
}
第二次:
{
"name": "Bill",
"scores": 95
}
你不能在integere函数上调用reduce。所以它给了你这个错误
如果更改console.logwinnerc1、c2、c2;到console.logwinnerc1、c2、c3;它会很好用的
我建议不要更改在函数中检索的对象。但是做一个新的物体。这就是函数式编程方式
function winner(c1, c2, c3) {
var customerArr = [];
customerArr.push(c1, c2, c3);
// console.log(customerArr);
const newCustomerArr = customerArr.map(customer => ({
...customer,
scores: customer.scores.reduce(function(total, scores) {
return total + scores;
}, 0)
}));
return newCustomerArr;
}
c1 = {
"name": "Bob",
"scores": [10, 65]
}
c2 = {
"name": "Bill",
"scores": [90, 5]
}
c3 = {
"name": "Charlie",
"scores": [40, 55]
};
console.log(winner(c1, c2, c2));
你可以试试这个
var c1 = {
"name": "Bob",
"scores": [10, 65]
}
var c2 = {
"name": "Bill",
"scores": [90, 5]
}
var c3 = {
"name": "Charlie",
"scores": [40, 55]
};
var custom = [c1, c2, c3];
function winner(customerArr){
customerArr.forEach(customer => {
customer.scores = customer.scores.reduce(function(total, scores) {
return total + scores;
}, 0)});
return customerArr;
};
console.log(winner(custom));
如果您分别传递c1、c2和c3作为参数,您将获得正确的输出。但是,如果您再次调用该函数,您将得到相同的错误,因为对象将发生变异,分数将不再是数组
您可以尝试以下操作:
logwinnerObject.assign{},c1,Object.assign{},c2,Object.assign{},c3;问题在这里:console.logwinnerc1、c2、c2;注意最后一个参数。它应该是c3,但却是c2。错误的原因是您正在将分数数组中的分数覆盖为Total请检查代码段。它提供适当的输出,因此根据评论更新问题将使评论无效。不要那样做是的,你是对的,我应该通过c1,c2,c3。现在它成功了!!好吧,兄弟,我不会这么做的
var c1 = {
"name": "Bob",
"scores": [10, 65]
}
var c2 = {
"name": "Bill",
"scores": [90, 5]
}
var c3 = {
"name": "Charlie",
"scores": [40, 55]
};
var custom = [c1, c2, c3];
function winner(customerArr){
customerArr.forEach(customer => {
customer.scores = customer.scores.reduce(function(total, scores) {
return total + scores;
}, 0)});
return customerArr;
};
console.log(winner(custom));