Javascript 我是否以错误的方式使用了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

在这个问题中,我试图对每个对象的数组中的值求和

我预计产量为

[{姓名:鲍勃,分数:[75]},{姓名:比尔,分数:[95] },{姓名:查理,分数:[95]}]

O/p:

TypeError:customerArr[i].scores.reduce不是一个函数


传递与第二个和第三个参数相同的对象

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