【问题标题】:How to create a nested array of object from an array of objects如何从对象数组创建嵌套的对象数组
【发布时间】:2021-08-02 13:53:34
【问题描述】:

如何循环遍历这个对象数组并对其进行更改,以使各个菜单项嵌套在对象 menu_name 中?

const menus = [
  { menu_name: 'Entre', id:0 },
  {
    name: 'Soup',
    price: 14.99,
    id:1
  },
  {
    name: 'Chips & Salsa',
    price: 7.99,
    id:2
  },
  {
    name: 'Chicken Nuggets',
    price: 12.99,
    id:3
  },
  { menu_name: 'Sides', id:4 },
  {
    name: 'Fries',
    price: 4.99,
    id:5
  },
  {
    name: 'Drinks',
    price: 2.99,
    id:6
  },
  {
    name: 'Onion Rings',
    price: 5.99,
    id:7
  },
];

每个 menu_name 对象的最终结果应如下所示,其中菜单数组嵌套在 menu_name 对象中

  {
        menu_name: 'Sides',
        menu: [
          {
            name: 'Fries',
            price: 4.99,
          },
          {
            name: 'Drinks',
            price: 2.99,
          },
          {
            name: 'Onion Rings',
            price: 5.99,
          },
        ],
      },

【问题讨论】:

    标签: javascript arrays loops for-loop object


    【解决方案1】:

    您可以使用reduceobject destructuring 轻松实现此目的

    const menus = [
      { menu_name: "Entre", id: 0 },
      {
        name: "Soup",
        price: 14.99,
        id: 1,
      },
      {
        name: "Chips & Salsa",
        price: 7.99,
        id: 2,
      },
      {
        name: "Chicken Nuggets",
        price: 12.99,
        id: 3,
      },
      { menu_name: "Sides", id: 4 },
      {
        name: "Fries",
        price: 4.99,
        id: 5,
      },
      {
        name: "Drinks",
        price: 2.99,
        id: 6,
      },
      {
        name: "Onion Rings",
        price: 5.99,
        id: 7,
      },
    ];
    
    const result = menus.reduce((acc, curr) => {
      const { menu_name } = curr;
      if (menu_name) {
        acc.push({ menu_name, menu: [] });
      } else {
        const { name, price } = curr;
        acc[acc.length - 1].menu.push({ name, price });
      }
      return acc;
    }, []);
    
    console.log(result);

    【讨论】:

    • 这是你想要的吗?
    • 请您解释一下如何,acc[acc.length - 1].menu.push({ name, price }); //这条线是如何工作的?为什么不 acc.menu.push({ name, price }); // 不工作?
    • @MamunurRashid acc.menu.push({ name, price }); 表示 acc 是一个 objectmenu 是一个 array ,您在其中推送一个包含 nameprice 的对象。但我所做的结构是一组对象。由于它是一个数组,所以你需要找到menu属性所在的对象,然后推送该对象。
    【解决方案2】:
    var newMenu = [];
    menus.forEach(menu=>{
      if(menu.menu_name){
          newMenu.push({...menu, menu: []})
      }else{
          newMenu[newMenu.length-1].menu.push(menu)
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2021-11-28
      • 2020-12-21
      • 2022-01-08
      • 1970-01-01
      • 2019-04-23
      相关资源
      最近更新 更多