为了账号安全,请及时绑定邮箱和手机立即绑定

链接数组方法(filter、map、reduce)而不是使用双循环

链接数组方法(filter、map、reduce)而不是使用双循环

温温酱 2022-12-22 09:40:29
我遇到了一个我无法解决的问题......所以这就是我想要做的。给定以下对象数组,products = [    { name: 'Sonoma', ingredients: ['artichoke', 'sundried tomatoes', 'mushrooms'], containsNuts: false },    { name: 'Pizza Primavera', ingredients: ['roma', 'sundried tomatoes', 'goats cheese', 'rosemary'], containsNuts: false },    { name: 'South Of The Border', ingredients: ['black beans', 'jalapenos', 'mushrooms'], containsNuts: false },    { name: 'Blue Moon', ingredients: ['blue cheese', 'garlic', 'walnuts'], containsNuts: true },    { name: 'Taste Of Athens', ingredients: ['spinach', 'kalamata olives', 'sesame seeds'], containsNuts: true },];我知道我可以通过嵌套循环运行它以按成分名称添加键,然后在我循环遍历计数时增加值,如下所示:      let ingredientCount = {};   for (i = 0; i < products.length; i += 1) {    for (j = 0; j < products[i].ingredients.length; j += 1) { //loop ingredients       ingredientCount[products[i].ingredients[j]] = (ingredientCount[products[i].ingredients[j]] || 0) + 1;     }  }因此, ingredientCount 应该是这样的:{ "artichoke": 1 "mushrooms": 2 } ***这里的问题是我需要使用 map 和 reduce 来创建与上面相同的结果。let ingredientCount = {}    ingredientCount =     products.filter ((value) => {        // filter out arrays within ingredients         // so out come should be like          /*         [ingredients: ['artichoke', 'sundried tomatoes', 'mushrooms']        ,ingredients: ['roma', 'sundried tomatoes', 'goats cheese', 'rosemary']        ,ingredients: ['black beans', 'jalapenos', 'mushrooms']        ,ingredients: ['blue cheese', 'garlic', 'walnuts']        ,ingredients: ['spinach', 'kalamata olives', 'sesame seeds']        */    }).map ((value) => {        /* then take out ingredients and map this array to          arthichoke: ['artichoke','artichoke','artichoke']        sundried tomatoes: ['sundried tomatoes']        etc...         */        })无论如何,我可以使用上面的数组方法来获得完全相同的结果而不必使用循环吗?提前致谢。
查看完整描述

5 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

使用flatMap和reduce。(除了??和,运算符)


const products = [

    { name: 'Sonoma', ingredients: ['artichoke', 'sundried tomatoes', 'mushrooms'], containsNuts: false },

    { name: 'Pizza Primavera', ingredients: ['roma', 'sundried tomatoes', 'goats cheese', 'rosemary'], containsNuts: false },

    { name: 'South Of The Border', ingredients: ['black beans', 'jalapenos', 'mushrooms'], containsNuts: false },

    { name: 'Blue Moon', ingredients: ['blue cheese', 'garlic', 'walnuts'], containsNuts: true },

    { name: 'Taste Of Athens', ingredients: ['spinach', 'kalamata olives', 'sesame seeds'], containsNuts: true },

];


const ingredientCount = products

  .flatMap(({ ingredients }) => ingredients)

  .reduce((acc, item) => ((acc[item] = (acc[item] ?? 0) + 1), acc), {});


console.log(ingredientCount);


查看完整回答
反对 回复 2022-12-22
?
ibeautiful

TA贡献1993条经验 获得超6个赞

您需要使用map(),flat()然后使用reduce()。该函数flat()展平数组。


products = [

    { name: 'Sonoma', ingredients: ['artichoke', 'sundried tomatoes', 'mushrooms'], containsNuts: false },

    { name: 'Pizza Primavera', ingredients: ['roma', 'sundried tomatoes', 'goats cheese', 'rosemary'], containsNuts: false },

    { name: 'South Of The Border', ingredients: ['black beans', 'jalapenos', 'mushrooms'], containsNuts: false },

    { name: 'Blue Moon', ingredients: ['blue cheese', 'garlic', 'walnuts'], containsNuts: true },

    { name: 'Taste Of Athens', ingredients: ['spinach', 'kalamata olives', 'sesame seeds'], containsNuts: true },

];


let obj = products

              .map(p => p.ingredients)

              .flat()

              .reduce((obj, val) => {

                  obj[val] = (obj[val] || 0) + 1;

                  return obj;

              }, {});

console.log(obj);


查看完整回答
反对 回复 2022-12-22
?
当年话下

TA贡献1890条经验 获得超9个赞

使用数组的 .reduce 方法和 .forEach 方法的解决方案。


var products = [

    { name: 'Sonoma', ingredients: ['artichoke', 'sundried tomatoes', 'mushrooms'], containsNuts: false },

    { name: 'Pizza Primavera', ingredients: ['roma', 'sundried tomatoes', 'goats cheese', 'rosemary'], containsNuts: false },

    { name: 'South Of The Border', ingredients: ['black beans', 'jalapenos', 'mushrooms'], containsNuts: false },

    { name: 'Blue Moon', ingredients: ['blue cheese', 'garlic', 'walnuts'], containsNuts: true },

    { name: 'Taste Of Athens', ingredients: ['spinach', 'kalamata olives', 'sesame seeds'], containsNuts: true },

];


var result = products.reduce((acc,obj) => 

   {obj.ingredients.forEach(ob=> acc[ob] = acc[ob]+1 || 1)

    return acc;

},{});


console.log(result);


查看完整回答
反对 回复 2022-12-22
?
qq_遁去的一_1

TA贡献1725条经验 获得超8个赞

用于Array.prototype.reduce减少数组并增加计数。

const products = [{

    name: 'Sonoma',

    ingredients: ['artichoke', 'sundried tomatoes', 'mushrooms'],

    containsNuts: false

  },

  {

    name: 'Pizza Primavera',

    ingredients: ['roma', 'sundried tomatoes', 'goats cheese', 'rosemary'],

    containsNuts: false

  },

  {

    name: 'South Of The Border',

    ingredients: ['black beans', 'jalapenos', 'mushrooms'],

    containsNuts: false

  },

  {

    name: 'Blue Moon',

    ingredients: ['blue cheese', 'garlic', 'walnuts'],

    containsNuts: true

  },

  {

    name: 'Taste Of Athens',

    ingredients: ['spinach', 'kalamata olives', 'sesame seeds'],

    containsNuts: true

  },

];


const result = products.reduce((acc, { ingredients }) => {

  ingredients.forEach((ingredient) => {

    acc[ingredient] = (acc[ingredient] || 0) + 1;

  });

  return acc;

}, Object.create(null));


console.log(result);



查看完整回答
反对 回复 2022-12-22
?
慕的地10843

TA贡献1785条经验 获得超8个赞

您可以使用两个forEachor map,并维护一个只需要更新的最终数组。


let products = [

    { name: 'Sonoma', ingredients: ['artichoke', 'sundried tomatoes', 'mushrooms'], containsNuts: false },

    { name: 'Pizza Primavera', ingredients: ['roma', 'sundried tomatoes', 'goats cheese', 'rosemary'], containsNuts: false },

    { name: 'South Of The Border', ingredients: ['black beans', 'jalapenos', 'mushrooms'], containsNuts: false },

    { name: 'Blue Moon', ingredients: ['blue cheese', 'garlic', 'walnuts'], containsNuts: true },

    { name: 'Taste Of Athens', ingredients: ['spinach', 'kalamata olives', 'sesame seeds'], containsNuts: true },

];


let iCount = {};

products.forEach((c) => c.ingredients.forEach((i) => iCount.hasOwnProperty(i) ? iCount[i]++ : iCount[i] = 1));

console.log(iCount);


查看完整回答
反对 回复 2022-12-22
  • 5 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号