使用map和forEach过滤对象数组

时间:2020-09-02 13:11:26

标签: javascript foreach

我想过滤一个数组对象(列表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”。感谢您阅读甚至帮助初学者!

3 个答案:

答案 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对其进行播种即可。如果存在,则可以有效地增加它。

此方法的优势在于您:

  • 请勿在{{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);