Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用map和forEach筛选对象数组_Javascript_Foreach - Fatal编程技术网

Javascript 使用map和forEach筛选对象数组

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'

我想过滤一个数组对象(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' },
  { 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函数在遇到新的唯一值时只需添加一个新条目
当然,如果你想充分利用ES6,你可以使用对象分解。。。但如果您不习惯语法,它可能看起来有点复杂:

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,取决于是否有人吃素食,标准等,但实际上并没有计算有多少人吃标准等。我改变了我原来的帖子中的例子,使它更清楚一点。