Javascript 为什么.reduce()要求我在使用累加器对对象中的特定键值对求和时输入累加器的起始值

Javascript 为什么.reduce()要求我在使用累加器对对象中的特定键值对求和时输入累加器的起始值,javascript,arrays,Javascript,Arrays,我想我实际上可能已经明白了这一点,只是想确认一下,以确保我真的理解了这一点 我在用这个阵列做练习 const cards = [ { id:4, name:'charmander', type:'fire', base_experience:62 }, { id:7, name:'Squirtle', type:'water', base_experience:63 }, { id:11, name:'Metapod', type:'bug', base_experie

我想我实际上可能已经明白了这一点,只是想确认一下,以确保我真的理解了这一点

我在用这个阵列做练习

 const cards = [
    { id:4, name:'charmander', type:'fire', base_experience:62 },
    { id:7, name:'Squirtle', type:'water', base_experience:63 },
    { id:11, name:'Metapod', type:'bug', base_experience:72 },
    { id:12, name:'Butterfree', type:'flying', base_experience:178 },
    { id:25, name:'Pikachu', type:'electric', base_experience:112 },
    { id:39, name:'Jigglypuff', type:'normal', base_experience:95 },
    { id:94, name:'Gengar', type:'poison', base_experience:225 },
    { id:133, name:'Eevee', type:'normal', base_experience:65 },
]
这就减少了

    const totalScore = cards.reduce((acc, card) => {
        return acc + card.base_experience
    })
它不断返回一个奇怪的对象类型的东西,并连接字符串而不是求和的数字。。。。我想,因为我没有为累加器提供起始值,所以它只是使用第一个对象作为累加器,然后尝试向其添加一个数字,但它不起作用。一旦我像这样添加了起始值

    const totalScore = cards.reduce((acc, card) => {
        return acc + card.base_experience
    }, 0)
它工作得很好。我想知道是否有更好的方法。我试过这个

    const totalScore = cards.reduce((acc, card) => {
        return acc.base_experience + card.base_experience
    })
我几乎知道它会失败,因为通过acc的第二次运行会很不正常

如有任何想法,将不胜感激。

来自:


initialValue:用作回调第一次调用的第一个参数的值。如果未提供initialValue,则将使用并跳过数组中的第一个元素

在您的例子中,您必须添加一个初始值,因为您处理的是数字。您可以稍微压缩代码(因为您只返回一个值):

const卡=[
{id:4,名字:“魔法师”,类型:“火”,基本经验:62},
{id:7,名字:“斯奎特尔”,类型:“水”,基本经验:63},
{id:11,名称:“Metapod”,类型:“bug”,基本经验:72},
{id:12,名字:“无黄油”,类型:“飞行”,基地经验:178},
{id:25,姓名:“皮卡丘”,类型:“电动”,基本经验:112},
{id:39,名字:“Jigglypuff”,类型:“normal”,基本经验:95},
{id:94,名字:“根格”,类型:“毒药”,基础经验:225},
{id:133,名字:“Eevee”,类型:“normal”,基本经验:65},
]
const totalScore=卡片。reduce((acc,{base_experience})=>
acc+基本经验
, 0)

console.log(totalScore)
您可以执行以下操作:

const卡=[
{id:4,名字:'charmander',类型:'fire',基本经验:62},
{id:7,名称:'Squirtle',类型:'water',基本经验:63},
{id:11,名称:'Metapod',类型:'bug',基本经验:72},
{id:12,姓名:'Butterfree',类型:'flying',基地经验:178},
{id:25,姓名:'Pikachu',类型:'electric',基本经验:112},
{id:39,name:'Jigglypuff',type:'normal',base_experience:95},
{id:94,姓名:'Gengar',类型:'poison',基本经验:225},
{id:133,name:'Eevee',type:'normal',base_experience:65},
]
const totalScore=卡片
.map(s=>s.base_经验)
.减少((acc,exp)=>acc+exp)

console.dir(totalScore)
“如果未提供初始值,将使用并跳过数组中的第一个元素。”请参阅<代码>{id:4,名称:'charmander',类型:'fire',base_experience:62},一个对象,将无法按预期使用
+
操作符。您已经找到了更好的方法…所以在第一个示例中,您正在从卡中解构base_experience,对吗?我不知道你能那样做。然后进行隐式返回。那很好。我还喜欢另外两个选择。。。对那里的返回键有点满意。谢谢嘿。。。我看你的答案是好的。当我看到它有-2时,它有点不对劲。奇怪的现在每天都有很多这样丑陋的反对票。谢谢你的回答。这样链接它们可以使reduce更容易理解。我读了几篇关于reduce的文章,才意识到它传递了整个第一个对象。为什么我会感到沮丧?