Javascript 如何在对象数组上使用reduce方法创建一个对象,每个对象的总值是多少?

Javascript 如何在对象数组上使用reduce方法创建一个对象,每个对象的总值是多少?,javascript,Javascript,我尝试在一组对象上使用reduce方法,每个对象都是一个人,他们喜欢吃什么口味的冰淇淋。目标是将此数组简化为单个对象,其中包含作为属性的味道,以及作为值列出味道的总次数 数据: const data = [ { name: 'Tyler', favoriteIceCreams: ['Strawberry', 'Vanilla', 'Chocolate', 'Cookies & Cream'] }, { name: 'Richard', favoriteIceCream

我尝试在一组对象上使用reduce方法,每个对象都是一个人,他们喜欢吃什么口味的冰淇淋。目标是将此数组简化为单个对象,其中包含作为属性的味道,以及作为值列出味道的总次数

数据:

const data = [
     { name: 'Tyler', favoriteIceCreams: ['Strawberry', 'Vanilla', 'Chocolate', 'Cookies & Cream'] },
     { name: 'Richard', favoriteIceCreams: ['Cookies & Cream', 'Mint Chocolate Chip', 'Chocolate', 'Vanilla'] },
     { name: 'Amanda', favoriteIceCreams: ['Chocolate', 'Rocky Road', 'Pistachio', 'Banana'] },
     { name: 'Andrew', favoriteIceCreams: ['Vanilla', 'Chocolate', 'Mint Chocolate Chip'] },
     { name: 'David', favoriteIceCreams: ['Vanilla', 'French Vanilla', 'Vanilla Bean', 'Strawberry'] },
     { name: 'Karl', favoriteIceCreams: ['Strawberry', 'Chocolate', 'Mint Chocolate Chip'] }
 ];
到目前为止,这就是我所拥有的,但老实说,我不确定如何做到这一点

let iceCreamTotals = {
         Strawberry: 0,
         Vanilla: 0,
         Chocolate: 0,
         CookiesCream: 0,
         MintChocolateChip: 0,
         RockyRoad: 0,
         Pistachio: 0,
         Banana: 0,
         FrenchVanilla: 0,
         VanillaBean: 0
     }

     data.reduce((total, current) => {

         return iceCreamTotals
     }, 0)
将此数组缩减为单个对象,因此要缩减的第二个参数(可选)应该是一个对象。然后在每一步中,为数组c.favoriteCreams.forEach中的每个元素计算相应的属性。p[cream]=p[cream]| | 0+1;如果存在,则仅为add one的语法sugar,否则设置为0+1

常数数据=[ {名称:'Tyler',喜爱的冰淇淋:['草莓','香草','巧克力','Cookies&Cream']}, {名字:'Richard',最喜欢的冰淇淋:['Cookies&Cream','Mint Chocolate Chip','Chocolate','Vanilla']}, {名字:'Amanda',最喜欢的冰淇淋:['Chocolate','Rocky Road','Aprachio','Banana']}, {名称:'Andrew',最受欢迎的冰淇淋:['香草','巧克力','薄荷巧克力片]}, {名字:'David',最受欢迎的冰淇淋:['香草','French香草','香草豆','草莓']}, {名称:'Karl',最喜欢的冰淇淋:['草莓','巧克力','薄荷巧克力片]} ]; console.logdata.reducep,c=>{ c、 favoriteIceCreams.forEachcream=>{ p[奶油]=p[奶油]| | 0+1; }; 返回p; }, {}; 将此数组缩减为单个对象,因此要缩减的第二个参数(可选)应该是一个对象。然后在每一步中,为数组c.favoriteCreams.forEach中的每个元素计算相应的属性。p[cream]=p[cream]| | 0+1;如果存在,则仅为add one的语法sugar,否则设置为0+1

常数数据=[ {名称:'Tyler',喜爱的冰淇淋:['草莓','香草','巧克力','Cookies&Cream']}, {名字:'Richard',最喜欢的冰淇淋:['Cookies&Cream','Mint Chocolate Chip','Chocolate','Vanilla']}, {名字:'Amanda',最喜欢的冰淇淋:['Chocolate','Rocky Road','Aprachio','Banana']}, {名称:'Andrew',最受欢迎的冰淇淋:['香草','巧克力','薄荷巧克力片]}, {名字:'David',最受欢迎的冰淇淋:['香草','French香草','香草豆','草莓']}, {名称:'Karl',最喜欢的冰淇淋:['草莓','巧克力','薄荷巧克力片]} ]; console.logdata.reducep,c=>{ c、 favoriteIceCreams.forEachcream=>{ p[奶油]=p[奶油]| | 0+1; }; 返回p;
}, {}; 你可以一边走一边收集味道名称和数量。下面创建一个对象,其属性是数据中的味道,并计算它们出现的次数

风险值数据=[ {名称:'Tyler',喜爱的冰淇淋:['草莓','香草','巧克力','Cookies&Cream']}, {名字:'Richard',最喜欢的冰淇淋:['Cookies&Cream','Mint Chocolate Chip','Chocolate','Vanilla']}, {名字:'Amanda',最喜欢的冰淇淋:['Chocolate','Rocky Road','Aprachio','Banana']}, {名称:'Andrew',最受欢迎的冰淇淋:['香草','巧克力','薄荷巧克力片]}, {名字:'David',最受欢迎的冰淇淋:['香草','French香草','香草豆','草莓']}, {名称:'Karl',最喜欢的冰淇淋:['草莓','巧克力','薄荷巧克力片]} ]; var flavours=data.reducefunctionacc,obj{ //对于每种味道,如果还没有添加到累加器中,则将其添加到累加器中 //增加它的数量 最喜欢的冰淇淋味道{ if!acc[味道]{ acc[flavor]=0; } ++acc[风味]; }; 返回acc; },Object.createnull;
香精 你可以一边走一边收集味道名称和数量。下面创建一个对象,其属性是数据中的味道,并计算它们出现的次数

风险值数据=[ {名称:'Tyler',喜爱的冰淇淋:['草莓','香草','巧克力','Cookies&Cream']}, {名字:'Richard',最喜欢的冰淇淋:['Cookies&Cream','Mint Chocolate Chip','Chocolate','Vanilla']}, {名字:'Amanda',最喜欢的冰淇淋:['Chocolate','Rocky Road','Aprachio','Banana']}, {名称:'Andrew',最受欢迎的冰淇淋:['香草','巧克力','薄荷巧克力片]}, {名字:'David',最受欢迎的冰淇淋:['香草','French香草','香草豆','草莓']}, {名称:'Karl',最喜欢的冰淇淋:['草莓','巧克力','薄荷巧克力片]} ]; var flavours=data.reducefunctionacc,obj{ //对于每种味道,如果还没有添加到累加器中,则将其添加到累加器中 //增加它的数量 最喜欢的冰淇淋味道{ if!acc[味道]{ acc[flavor]=0; } ++acc[风味]; }; 返回acc; },Object.createnull; 香精 你可以使用…的循环,O bject.hasOwnProperty检查是否在对象上设置了属性,如果为真的增量值,则将值设置为0

您可以使用for..of循环,Object.hasOwnProperty检查属性是否设置为Object,如果为true increment value,否则将值设置为0


你的问题有两个方面。首先是收集所有人的所有口味。第二个是计算每种味道的频率。如果将这两个方面分开,您的代码将更简单、更易于调试,并且可读性更强。收集所有的口味只是一个简单的过程

const flavors = [].concat(...data.map(({favoriteIceCreams}) => favoriteIceCreams));
或者,如果您愿意:

const flavors = [];

for (const {favoriteIceCreams} of data) flavors.push(...favoriteIceCreams);

这里有许多关于计算数组中出现频率的解决方案。考虑一下,

你的问题有两个方面。首先是收集所有人的所有口味。第二个是计算每种味道的频率。如果将这两个方面分开,您的代码将更简单、更易于调试,并且可读性更强。收集所有的口味只是一个简单的过程

const flavors = [].concat(...data.map(({favoriteIceCreams}) => favoriteIceCreams));
或者,如果您愿意:

const flavors = [];

for (const {favoriteIceCreams} of data) flavors.push(...favoriteIceCreams);
这里有许多关于计算数组中出现频率的解决方案。考虑。

你可以将P[Calp]>0+1降低到+++ P[Calp]>1,但可能有点模糊。@ Ropg是,或者~~P[Calp] + 1:你可以将P[Calp]>0+1降低到++P[Calp]>1,但可能有点模糊。