我想过滤一个数组对象(列表1),并根据人们的饮食偏好返回一个看起来像这样的对象。
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.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”。感谢您阅读甚至帮助初学者!
答案 0 :(得分:1)
代码的问题在于,在forEach()
循环中,您正在重置mealTypes
对象。您可以使用Array.prototype.reduce()
来解决此问题,该方法有助于整理列表中每个遇到的项目的meal
属性的计数:
let allPeople = list1.reduce((acc, el) => {
acc[el.meal] = acc[el.meal]++ || 1;
return acc;
}, {});
基本上,您使用一个空对象{}
启动累加器。然后,在每次迭代中,您尝试增加对象中可能的数字,该数字可以通过其键acc[el.meal]
访问。当它不存在时,acc[el.meal]++
将返回NaN
(是虚假的),您只需使用初始值1
对其进行播种即可。如果存在,则可以有效地增加它。
此方法的优势在于您:
reduce
的所有可能值,因为reduce函数在遇到新的唯一值时会简单地添加一个新条目当然,如果您想充分利用ES6,则可以使用对象分解...,但是如果您不习惯语法,它看起来可能会有些复杂:
meal
请参见概念验证示例:
let allPeople = list1.reduce((acc, { meal }) => {
acc[meal] = acc[meal]++ || 1;
return acc;
}, {});
答案 1 :(得分:1)
javascript的forEach
的返回值为undefined
,这就是您在这里看到的内容。
如果您改为在mealTypes
之外初始化forEach
集合,然后使用forEach
修改该集合,则将获得所需的内容。
let mealTypes={vegetarian: 0, standard: 0, vegan: 0}
list1.forEach((el)=>{
if (el.meal==='vegetarian') {
mealTypes['vegetarian'] +=1;
}
else if (el.meal ==='standard') {
mealTypes['standard'] +=1;
}
else if (el.meal === 'vegan') {
mealTypes['vegan'] +=1;
}
});
console.log(mealTypes);
答案 2 :(得分:0)
使用Array#reduce累积所需数据。
let list1 = [
{ firstName: 'Noah', lastName: 'M.', country: 'Switzerland', continent: 'Europe', age: 19, language: 'C',
meal: 'vegetarian' },
{ firstName: 'Anna', lastName: 'R.', country: 'Liechtenstein', continent: 'Europe', age: 52, language: 'JavaScript',
meal: 'standard' }];
let res = list1.reduce((acc, cur) => {
if (acc[cur.meal]===undefined)
acc[cur.meal] = 1;
else
acc[cur.meal]++;
return acc;
}, {});
console.log(res);