Javascript 使用map和forEach筛选对象数组
我想过滤一个数组对象(list1),并根据人们的饮食偏好返回一个类似这样的对象Javascript 使用map和forEach筛选对象数组,javascript,foreach,Javascript,Foreach,我想过滤一个数组对象(list1),并根据人们的饮食偏好返回一个类似这样的对象 let allPeople = { vegetarian: 1, standard: 2, vegan: 0 } 名单如下: let list1 = [ { firstName: 'Noah', lastName: 'M.', country: 'Switzerland', continent: 'Europe', age: 19, language: 'C', meal: 'vegetarian'
let allPeople = { vegetarian: 1, standard: 2, vegan: 0 }
名单如下:
let list1 = [
{ firstName: 'Noah', lastName: 'M.', country: 'Switzerland', continent: 'Europe', age: 19, language: 'C',
meal: 'vegetarian' },
{ firstName: 'Anna', lastName: 'K.', country: 'Liechtenstein', continent: 'Europe', age: 52, language: 'JavaScript',
meal: 'standard' },
{ firstName: 'Andi', lastName: 'R.', country: 'Liechtenstein', continent: 'Europe', age: 62, language: 'JavaScript',
meal: 'standard' }]
let allPeople = list1.reduce((acc, el) => {
acc[el.meal] = acc[el.meal]++ || 1;
return acc;
}, {});
这是我的密码:
let allPeople = list1.forEach((el)=>{
let mealTypes={vegetarian: 0, standard: 0, vegan: 0}
if (el.meal==='vegetarian') {
mealTypes['vegetarian'] +=1;
}
else if (el.meal ==='standard') {
mealTypes['standard'] +=1;
}
else if (el.meal === 'vegan') {
mealTypes['vegan'] +=1;
}
return mealTypes;
}
)
console.log(allPeople)
当我调用函数时,它返回“undefined”。感谢您的阅读,甚至帮助初学者 代码的问题是在
forEach()
循环中,您正在重置mealTypes
对象。您可以通过使用来解决此问题,这有助于核对列表中遇到的每个项目的deal
属性的计数:
let list1 = [
{ firstName: 'Noah', lastName: 'M.', country: 'Switzerland', continent: 'Europe', age: 19, language: 'C',
meal: 'vegetarian' },
{ firstName: 'Anna', lastName: 'K.', country: 'Liechtenstein', continent: 'Europe', age: 52, language: 'JavaScript',
meal: 'standard' },
{ firstName: 'Andi', lastName: 'R.', country: 'Liechtenstein', continent: 'Europe', age: 62, language: 'JavaScript',
meal: 'standard' }]
let allPeople = list1.reduce((acc, el) => {
acc[el.meal] = acc[el.meal]++ || 1;
return acc;
}, {});
基本上,用一个空对象启动累加器,{}
。然后,在每次迭代中,您尝试增加对象中的一个可能数字,通过其键访问,即acc[el.mein]
。当它不存在时,acc[el.mean]++
将返回NaN
(这是falsy),您只需使用1
的初始值对其进行种子设定。如果它存在,那么您可以有效地增加它
此方法的优点是您可以:
- 不要在
方法范围之外创建对象reduce
- 不需要知道对象数组中
的所有可能值,因为reduce函数在遇到新的唯一值时只需添加一个新条目
let allPeople = list1.reduce((acc, { meal }) => {
acc[meal] = acc[meal]++ || 1;
return acc;
}, {});
请参见概念验证示例:
让列表1=[{
名字:“诺亚”,
姓氏:M,
国家:'瑞士',
欧洲大陆,
年龄:19岁,
语言:“C”,
膳食:“素食者”
},
{
名字:“安娜”,
姓氏:“R.”,
国家:'列支敦士登',
欧洲大陆,
年龄:52岁,
语言:“JavaScript”,
膳食:“标准”
}
];
让allPeople=list1.reduce((acc,{mean})=>{
acc[膳食]=acc[膳食]++| | 1;
返回acc;
}, {});
console.log(所有人)代码>javascript的forEach
的返回值是未定义的
,这就是您在这里看到的
如果您在forEach
之外初始化mealTypes
集合,然后使用forEach
修改该集合,您将获得所需的内容
let mealTypes={素食者:0,标准:0,素食者:0}
列表1.forEach((el)=>{
如果(el.Dine===‘素食者’){
米型[‘素食者’]+=1;
}
否则,如果(el.MEIN===“标准”){
测量类型['standard']+=1;
}
否则,如果(el.MEIN===‘素食主义者’){
米型['vegan']+=1;
}
});
console.log(mealTypes)代码>用于累积所需数据
让列表1=[
{名字:“诺亚”,姓氏:“M.”,国家:“瑞士”,大陆:“欧洲”,年龄:19岁,语言:“C”,
膳食:“素食者”},
{名字:“安娜”,姓氏:“R.”,国家:“列支敦士登”,大陆:“欧洲”,年龄:52岁,语言:“JavaScript”,
膳食:'标准'}];
让res=list1.reduce((acc,cur)=>{
if(附件[当前膳食]==未定义)
acc[当前膳食]=1;
其他的
acc[当前膳食]+;
返回acc;
}, {});
控制台日志(res)
这意味着您需要实例化一个对象,同时了解要跟踪的值。@Terry-我故意这样做,因为OP想要计算零元素素食者:0
,但我更改了它。这取决于你是否需要实例化。谢谢你的详细回答Terry,我实际上刚刚尝试过,不幸的是,它只返回1或0,取决于是否有人吃素食,标准等,但实际上并没有计算有多少人吃标准等。我改变了我原来的帖子中的例子,使它更清楚一点。