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