JavaScript сгруппировать данные в древовидную структуру на 2 уровня глубиной, а последний уровень - массивом - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть JSON объект, подобный этому:

[
  {
    "venueId": "10001",
    "items": [
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1604",
        "itemDescription": "Chef Instruction",
        "categoryCode": "28",
        "categoryDescription": "Food Instructions",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1381",
        "itemDescription": "Meat Lovers Pizza",
        "categoryCode": "48",
        "categoryDescription": "25Fore - Pizza",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1027",
        "itemDescription": "Sweet Spot Latte  Mug",
        "categoryCode": "23",
        "categoryDescription": "Sweet Spot - Coffee/Tea",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "17",
        "itemCode": "1413",
        "itemDescription": "Garlic Bread",
        "categoryCode": "51",
        "categoryDescription": "25Fore - Starters",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "17",
        "itemCode": "51",
        "itemDescription": "Cascade Light Schooner",
        "categoryCode": "4",
        "categoryDescription": "Bulk Beer",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "15",
        "itemCode": "827",
        "itemDescription": "Banrock Station Moscato 1L",
        "categoryCode": "15",
        "categoryDescription": "Wine White",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "15",
        "itemCode": "1192",
        "itemDescription": "Apple Slice",
        "categoryCode": "31",
        "categoryDescription": "Cafe Gold - Cake Selection",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "15",
        "itemCode": "301",
        "itemDescription": "Tooheys New 6pk",
        "categoryCode": "4",
        "categoryDescription": "Bulk Beer",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "12",
        "itemCode": "1036",
        "itemDescription": "Cappuccino 16oz",
        "categoryCode": "23",
        "categoryDescription": "Sweet Spot - Coffee/Tea",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "12",
        "itemCode": "61",
        "itemDescription": "Great Northern Orig Pint",
        "categoryCode": "4",
        "categoryDescription": "Bulk Beer",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "12",
        "itemCode": "1232",
        "itemDescription": "Asst. Cheese/Crackers 5pce",
        "categoryCode": "33",
        "categoryDescription": "Cafe Gold - Savoury Cabinet",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "17",
        "itemCode": "863",
        "itemDescription": "Lindemans Bin 85 P/Grigio 250",
        "categoryCode": "15",
        "categoryDescription": "Wine White",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "17",
        "itemCode": "1600",
        "itemDescription": "Lemon/Lime Bitters Glass",
        "categoryCode": "7",
        "categoryDescription": "Postmix",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "17",
        "itemCode": "1143",
        "itemDescription": "Chocolate",
        "categoryCode": "28",
        "categoryDescription": "Food Instructions",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "491",
        "itemDescription": "Coke 330ml",
        "categoryCode": "9",
        "categoryDescription": "Soft Drink",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "335",
        "itemDescription": "Postmix Glass",
        "categoryCode": "7",
        "categoryDescription": "Postmix",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "68",
        "itemDescription": "Great Northern Super Crisp Po",
        "categoryCode": "4",
        "categoryDescription": "Bulk Beer",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1286",
        "itemDescription": "Mushroom Sauce",
        "categoryCode": "36",
        "categoryDescription": "Sauce Instructions",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1604",
        "itemDescription": "Chef Instruction",
        "categoryCode": "28",
        "categoryDescription": "Food Instructions",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1831",
        "itemDescription": "Ginger Beer Crows Nest 330ml",
        "categoryCode": "9",
        "categoryDescription": "Soft Drink",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1105",
        "itemDescription": "Filo/Salad",
        "categoryCode": "26",
        "categoryDescription": "Sweet Spot - Savoury Cabinet",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1187",
        "itemDescription": "Cafe Gold Pie 4 n 20",
        "categoryCode": "30",
        "categoryDescription": "Cafe Gold - Bar Menu",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1360",
        "itemDescription": "Extra-Lamb Shank",
        "categoryCode": "50",
        "categoryDescription": "25Fore - Specials",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1296",
        "itemDescription": "Side Chips",
        "categoryCode": "36",
        "categoryDescription": "Sauce Instructions",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1808",
        "itemDescription": "Add Reef Topper ",
        "categoryCode": "52",
        "categoryDescription": "25Fore - Toppers",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1224",
        "itemDescription": "Cafe Gold Long Black Mug",
        "categoryCode": "32",
        "categoryDescription": "Cafe Gold - Coffee/Tea",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "43",
        "itemDescription": "Carlton Mid Pint",
        "categoryCode": "4",
        "categoryDescription": "Bulk Beer",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "21",
        "itemDescription": "Canadian Club/Dry Schooner",
        "categoryCode": "4",
        "categoryDescription": "Bulk Beer",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "15",
        "itemCode": "105",
        "itemDescription": "XXXX Gold Schooner",
        "categoryCode": "4",
        "categoryDescription": "Bulk Beer",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "15",
        "itemCode": "1027",
        "itemDescription": "Sweet Spot Latte  Mug",
        "categoryCode": "23",
        "categoryDescription": "Sweet Spot - Coffee/Tea",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "15",
        "itemCode": "301",
        "itemDescription": "Tooheys New 6pk",
        "categoryCode": "4",
        "categoryDescription": "Bulk Beer",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1639",
        "itemDescription": "Upper Area",
        "categoryCode": "87",
        "categoryDescription": "Seating Instructions",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "335",
        "itemDescription": "Postmix Glass",
        "categoryCode": "7",
        "categoryDescription": "Postmix",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "491",
        "itemDescription": "Coke 330ml",
        "categoryCode": "9",
        "categoryDescription": "Soft Drink",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "17",
        "itemCode": "43",
        "itemDescription": "Carlton Mid Pint",
        "categoryCode": "4",
        "categoryDescription": "Bulk Beer",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "17",
        "itemCode": "1330",
        "itemDescription": "200g Rump",
        "categoryCode": "40",
        "categoryDescription": "25Fore - From The Grill",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "17",
        "itemCode": "1462",
        "itemDescription": "Lactose Free Milk ",
        "categoryCode": "54",
        "categoryDescription": "Coffee Instructions",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1625",
        "itemDescription": "Chicken",
        "categoryCode": "28",
        "categoryDescription": "Food Instructions",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "43",
        "itemDescription": "Carlton Mid Pint",
        "categoryCode": "4",
        "categoryDescription": "Bulk Beer",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "14",
        "itemCode": "1725",
        "itemDescription": "THURS T-Bone",
        "categoryCode": "46",
        "categoryDescription": "25Fore - Nightly Specials",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "15",
        "itemCode": "1261",
        "itemDescription": "Well Done",
        "categoryCode": "35",
        "categoryDescription": "Cooking Instructions",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "15",
        "itemCode": "104",
        "itemDescription": "XXXX Gold Pot",
        "categoryCode": "4",
        "categoryDescription": "Bulk Beer",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      },
      {
        "venueId": "10001",
        "locationId": "15",
        "itemCode": "1411",
        "itemDescription": "Bread Roll",
        "categoryCode": "51",
        "categoryDescription": "25Fore - Starters",
        "qty": 0,
        "saleValue": 0,
        "saleDatetime": "0001-01-01T00:00:00",
        "timeToLive": 0
      }
    ]
  }
]

Я хочу превратить это в новый JSON объект, где все сгруппировано по id (это уже есть, но мне нужен номер для стать ключом), затем по categoryCode, чтобы результат выглядел примерно так:

{
    '1': { 
        '555': [{ itemCode: '456'}, { itemCode: '457'}, { itemCode: '458'}]
    }
}

Есть ли простой способ сделать это, используя loda sh или просто JavaScript или какой-то пакет NPM ? Это похоже на этот вопрос: JavaScript группирует данные в древовидном представлении глубиной 2 уровня , но разница в том, что третий уровень представляет собой массив объектов.

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Вы можете взять два вложенных цикла и создать новые объекты / массивы, если это необходимо для групп.

var data = [{ venueId: "10001", items: [{ venueId: "10001", locationId: "14", itemCode: "1604", itemDescription: "Chef Instruction", categoryCode: "28", categoryDescription: "Food Instructions", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1381", itemDescription: "Meat Lovers Pizza", categoryCode: "48", categoryDescription: "25Fore - Pizza", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1027", itemDescription: "Sweet Spot Latte  Mug", categoryCode: "23", categoryDescription: "Sweet Spot - Coffee/Tea", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "17", itemCode: "1413", itemDescription: "Garlic Bread", categoryCode: "51", categoryDescription: "25Fore - Starters", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "17", itemCode: "51", itemDescription: "Cascade Light Schooner", categoryCode: "4", categoryDescription: "Bulk Beer", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "15", itemCode: "827", itemDescription: "Banrock Station Moscato 1L", categoryCode: "15", categoryDescription: "Wine White", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "15", itemCode: "1192", itemDescription: "Apple Slice", categoryCode: "31", categoryDescription: "Cafe Gold - Cake Selection", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "15", itemCode: "301", itemDescription: "Tooheys New 6pk", categoryCode: "4", categoryDescription: "Bulk Beer", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "12", itemCode: "1036", itemDescription: "Cappuccino 16oz", categoryCode: "23", categoryDescription: "Sweet Spot - Coffee/Tea", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "12", itemCode: "61", itemDescription: "Great Northern Orig Pint", categoryCode: "4", categoryDescription: "Bulk Beer", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "12", itemCode: "1232", itemDescription: "Asst. Cheese/Crackers 5pce", categoryCode: "33", categoryDescription: "Cafe Gold - Savoury Cabinet", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "17", itemCode: "863", itemDescription: "Lindemans Bin 85 P/Grigio 250", categoryCode: "15", categoryDescription: "Wine White", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "17", itemCode: "1600", itemDescription: "Lemon/Lime Bitters Glass", categoryCode: "7", categoryDescription: "Postmix", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "17", itemCode: "1143", itemDescription: "Chocolate", categoryCode: "28", categoryDescription: "Food Instructions", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "491", itemDescription: "Coke 330ml", categoryCode: "9", categoryDescription: "Soft Drink", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "335", itemDescription: "Postmix Glass", categoryCode: "7", categoryDescription: "Postmix", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "68", itemDescription: "Great Northern Super Crisp Po", categoryCode: "4", categoryDescription: "Bulk Beer", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1286", itemDescription: "Mushroom Sauce", categoryCode: "36", categoryDescription: "Sauce Instructions", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1604", itemDescription: "Chef Instruction", categoryCode: "28", categoryDescription: "Food Instructions", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1831", itemDescription: "Ginger Beer Crows Nest 330ml", categoryCode: "9", categoryDescription: "Soft Drink", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1105", itemDescription: "Filo/Salad", categoryCode: "26", categoryDescription: "Sweet Spot - Savoury Cabinet", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1187", itemDescription: "Cafe Gold Pie 4 n 20", categoryCode: "30", categoryDescription: "Cafe Gold - Bar Menu", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1360", itemDescription: "Extra-Lamb Shank", categoryCode: "50", categoryDescription: "25Fore - Specials", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1296", itemDescription: "Side Chips", categoryCode: "36", categoryDescription: "Sauce Instructions", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1808", itemDescription: "Add Reef Topper ", categoryCode: "52", categoryDescription: "25Fore - Toppers", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1224", itemDescription: "Cafe Gold Long Black Mug", categoryCode: "32", categoryDescription: "Cafe Gold - Coffee/Tea", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "43", itemDescription: "Carlton Mid Pint", categoryCode: "4", categoryDescription: "Bulk Beer", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "21", itemDescription: "Canadian Club/Dry Schooner", categoryCode: "4", categoryDescription: "Bulk Beer", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "15", itemCode: "105", itemDescription: "XXXX Gold Schooner", categoryCode: "4", categoryDescription: "Bulk Beer", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "15", itemCode: "1027", itemDescription: "Sweet Spot Latte  Mug", categoryCode: "23", categoryDescription: "Sweet Spot - Coffee/Tea", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "15", itemCode: "301", itemDescription: "Tooheys New 6pk", categoryCode: "4", categoryDescription: "Bulk Beer", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1639", itemDescription: "Upper Area", categoryCode: "87", categoryDescription: "Seating Instructions", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "335", itemDescription: "Postmix Glass", categoryCode: "7", categoryDescription: "Postmix", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "491", itemDescription: "Coke 330ml", categoryCode: "9", categoryDescription: "Soft Drink", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "17", itemCode: "43", itemDescription: "Carlton Mid Pint", categoryCode: "4", categoryDescription: "Bulk Beer", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "17", itemCode: "1330", itemDescription: "200g Rump", categoryCode: "40", categoryDescription: "25Fore - From The Grill", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "17", itemCode: "1462", itemDescription: "Lactose Free Milk ", categoryCode: "54", categoryDescription: "Coffee Instructions", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1625", itemDescription: "Chicken", categoryCode: "28", categoryDescription: "Food Instructions", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "43", itemDescription: "Carlton Mid Pint", categoryCode: "4", categoryDescription: "Bulk Beer", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "14", itemCode: "1725", itemDescription: "THURS T-Bone", categoryCode: "46", categoryDescription: "25Fore - Nightly Specials", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "15", itemCode: "1261", itemDescription: "Well Done", categoryCode: "35", categoryDescription: "Cooking Instructions", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "15", itemCode: "104", itemDescription: "XXXX Gold Pot", categoryCode: "4", categoryDescription: "Bulk Beer", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }, { venueId: "10001", locationId: "15", itemCode: "1411", itemDescription: "Bread Roll", categoryCode: "51", categoryDescription: "25Fore - Starters", qty: 0, saleValue: 0, saleDatetime: "0001-01-01T00:00:00", timeToLive: 0 }] }],
    result = data.reduce((r, { items }) => {
        items.forEach(({ itemCode, ...item }) => ['venueId', 'categoryCode']
            .reduce((o, k, i) => o[item[k]] = o[item[k]] || (i ? [] : {}), r)
            .push({ itemCode })
        );
        return r;
    }, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 13 февраля 2020

В вашем связанном связанном вопросе вы, похоже, хотели получить больше свойств, чем указано в этом примере. Вот функция, которая преобразует ваши данные в запрошенный формат, дополнительно позволяя вам указать, какие вложенные ключи вы хотите включить в ваш вывод:

const transformData = (array, keysToInclude) => {
  const result = {};
  for (const group of array) {
    const id = {};
    result[group.venueId] = id;
    for (const item of group.items) {
      let category = id[item.categoryCode];
      if (!category) {
        category = [];
        id[item.categoryCode] = category;
      }
      if (!keysToInclude) {
        category.push(item);
        continue;
      }
      const itemData = {};
      for (const key of keysToInclude) {
        if (Object.keys(item).includes(key)) itemData[key] = item[key];
      }
      category.push(itemData);
    }
  }
  return result;
};

const data=[{venueId:"10001",items:[{venueId:"10001",locationId:"14",itemCode:"1604",itemDescription:"Chef Instruction",categoryCode:"28",categoryDescription:"Food Instructions",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1381",itemDescription:"Meat Lovers Pizza",categoryCode:"48",categoryDescription:"25Fore - Pizza",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1027",itemDescription:"Sweet Spot Latte  Mug",categoryCode:"23",categoryDescription:"Sweet Spot - Coffee/Tea",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"17",itemCode:"1413",itemDescription:"Garlic Bread",categoryCode:"51",categoryDescription:"25Fore - Starters",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"17",itemCode:"51",itemDescription:"Cascade Light Schooner",categoryCode:"4",categoryDescription:"Bulk Beer",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"15",itemCode:"827",itemDescription:"Banrock Station Moscato 1L",categoryCode:"15",categoryDescription:"Wine White",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"15",itemCode:"1192",itemDescription:"Apple Slice",categoryCode:"31",categoryDescription:"Cafe Gold - Cake Selection",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"15",itemCode:"301",itemDescription:"Tooheys New 6pk",categoryCode:"4",categoryDescription:"Bulk Beer",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"12",itemCode:"1036",itemDescription:"Cappuccino 16oz",categoryCode:"23",categoryDescription:"Sweet Spot - Coffee/Tea",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"12",itemCode:"61",itemDescription:"Great Northern Orig Pint",categoryCode:"4",categoryDescription:"Bulk Beer",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"12",itemCode:"1232",itemDescription:"Asst. Cheese/Crackers 5pce",categoryCode:"33",categoryDescription:"Cafe Gold - Savoury Cabinet",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"17",itemCode:"863",itemDescription:"Lindemans Bin 85 P/Grigio 250",categoryCode:"15",categoryDescription:"Wine White",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"17",itemCode:"1600",itemDescription:"Lemon/Lime Bitters Glass",categoryCode:"7",categoryDescription:"Postmix",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"17",itemCode:"1143",itemDescription:"Chocolate",categoryCode:"28",categoryDescription:"Food Instructions",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"491",itemDescription:"Coke 330ml",categoryCode:"9",categoryDescription:"Soft Drink",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"335",itemDescription:"Postmix Glass",categoryCode:"7",categoryDescription:"Postmix",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"68",itemDescription:"Great Northern Super Crisp Po",categoryCode:"4",categoryDescription:"Bulk Beer",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1286",itemDescription:"Mushroom Sauce",categoryCode:"36",categoryDescription:"Sauce Instructions",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1604",itemDescription:"Chef Instruction",categoryCode:"28",categoryDescription:"Food Instructions",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1831",itemDescription:"Ginger Beer Crows Nest 330ml",categoryCode:"9",categoryDescription:"Soft Drink",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1105",itemDescription:"Filo/Salad",categoryCode:"26",categoryDescription:"Sweet Spot - Savoury Cabinet",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1187",itemDescription:"Cafe Gold Pie 4 n 20",categoryCode:"30",categoryDescription:"Cafe Gold - Bar Menu",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1360",itemDescription:"Extra-Lamb Shank",categoryCode:"50",categoryDescription:"25Fore - Specials",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1296",itemDescription:"Side Chips",categoryCode:"36",categoryDescription:"Sauce Instructions",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1808",itemDescription:"Add Reef Topper ",categoryCode:"52",categoryDescription:"25Fore - Toppers",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1224",itemDescription:"Cafe Gold Long Black Mug",categoryCode:"32",categoryDescription:"Cafe Gold - Coffee/Tea",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"43",itemDescription:"Carlton Mid Pint",categoryCode:"4",categoryDescription:"Bulk Beer",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"21",itemDescription:"Canadian Club/Dry Schooner",categoryCode:"4",categoryDescription:"Bulk Beer",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"15",itemCode:"105",itemDescription:"XXXX Gold Schooner",categoryCode:"4",categoryDescription:"Bulk Beer",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"15",itemCode:"1027",itemDescription:"Sweet Spot Latte  Mug",categoryCode:"23",categoryDescription:"Sweet Spot - Coffee/Tea",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"15",itemCode:"301",itemDescription:"Tooheys New 6pk",categoryCode:"4",categoryDescription:"Bulk Beer",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1639",itemDescription:"Upper Area",categoryCode:"87",categoryDescription:"Seating Instructions",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"335",itemDescription:"Postmix Glass",categoryCode:"7",categoryDescription:"Postmix",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"491",itemDescription:"Coke 330ml",categoryCode:"9",categoryDescription:"Soft Drink",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"17",itemCode:"43",itemDescription:"Carlton Mid Pint",categoryCode:"4",categoryDescription:"Bulk Beer",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"17",itemCode:"1330",itemDescription:"200g Rump",categoryCode:"40",categoryDescription:"25Fore - From The Grill",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"17",itemCode:"1462",itemDescription:"Lactose Free Milk ",categoryCode:"54",categoryDescription:"Coffee Instructions",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1625",itemDescription:"Chicken",categoryCode:"28",categoryDescription:"Food Instructions",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"43",itemDescription:"Carlton Mid Pint",categoryCode:"4",categoryDescription:"Bulk Beer",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"14",itemCode:"1725",itemDescription:"THURS T-Bone",categoryCode:"46",categoryDescription:"25Fore - Nightly Specials",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"15",itemCode:"1261",itemDescription:"Well Done",categoryCode:"35",categoryDescription:"Cooking Instructions",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"15",itemCode:"104",itemDescription:"XXXX Gold Pot",categoryCode:"4",categoryDescription:"Bulk Beer",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0},{venueId:"10001",locationId:"15",itemCode:"1411",itemDescription:"Bread Roll",categoryCode:"51",categoryDescription:"25Fore - Starters",qty:0,saleValue:0,saleDatetime:"0001-01-01T00:00:00",timeToLive:0}]}];

const onlyItemCodes = transformData(data, ['itemCode']);
const allKeys = transformData(data);

const log = data => console.log(JSON.stringify(data, null, 2));

log(onlyItemCodes);
log(allKeys);
0 голосов
/ 13 февраля 2020

Я думаю, что лучший подход - сделать простой двойной l oop. Один раз над разными строками, а затем над элементами. Затем в этих циклах вы заполняете конечный объект желаемой структурой:

var initialArray = [
    {
        id: '1', 
        items: [
            {
                id: '1',
                saleId: '123',
                saleIdAndItemId: '123456',
                locationId: '123',
                itemCode: '456',
                itemDescription: 'my item',
                categoryCode: '555',
                categoryDescription: 'my category',
                qty: 10,
                saleValue: 200
            },
            {
                id: '1',
                saleId: '123',
                saleIdAndItemId: '123456',
                locationId: '123',
                itemCode: '457',
                itemDescription: 'my item',
                categoryCode: '555',
                categoryDescription: 'my category',
                qty: 10,
                saleValue: 200
            },
            {
                id: '1',
                saleId: '123',
                saleIdAndItemId: '123456',
                locationId: '123',
                itemCode: '458',
                itemDescription: 'my item',
                categoryCode: '555',
                categoryDescription: 'my category',
                qty: 10,
                saleValue: 200
            }
        ]
    },
    {
        id: '2', 
        items: [
            {
                id: '2',
                saleId: '123',
                saleIdAndItemId: '123456',
                locationId: '123',
                itemCode: '456',
                itemDescription: 'my item',
                categoryCode: '556',
                categoryDescription: 'my category 6',
                qty: 10,
                saleValue: 200
            }
        ]
    },
    {
        id: '3', 
        items: [
            {
                venueId: '3',
                saleId: '123',
                saleIdAndItemId: '123456',
                locationId: '123',
                itemCode: '457',
                itemDescription: 'my item',
                categoryCode: '557',
                categoryDescription: 'my category 7',
                qty: 10,
                saleValue: 200
            }
        ]
    }
];

var finalObject = {},
    currentRow = {},
    currentItem = {},
    newItemObject = {};

for (var i in initialArray) {
    currentRow = initialArray[i];
    newItemObject = {};
    for (var j in currentRow.items) {
        currentItem = currentRow.items[j];
        // this if is in case there are different category codes in the item array
        if (!newItemObject.hasOwnProperty(currentItem.categoryCode)) {
            newItemObject[currentItem.categoryCode] = [];
        }
        // you could just push the entire currentItem if you want all the data
        // newItemObject[currentItem.categoryCode].push(currentItem);
        newItemObject[currentItem.categoryCode].push({
            'itemCode': currentItem.itemCode
        });
    }
    
    finalObject[currentRow.id] = newItemObject;
}

console.log(finalObject);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...