Уменьшить плоский массив до двухуровневого вложенного массива объектов - PullRequest
0 голосов
/ 04 июня 2019

У меня есть следующий плоский массив:

{ "State": "New York", "Name": "Jane", "Product": "Apple" },
{ "State": "New York", "Name": "Jill", "Product": "Banana"},
{ "State": "California", "Name": "Jill", "Product": "Apple" },
{ "State": "California", "Name": "Jill", "Product": "Banana"}

Можно ли создать двухуровневый вложенный массив (т. Е. Имя> вложенный массив состояний> вложенный массив продуктов)?Это выглядело бы следующим образом:

{
  "Name": "Jill",
  "States": [
   {
   "State": "California",
   "Products": [
      {
    "Product": "Apple"
      },
      {
          "Product": "Banana"
      }
    ]
   },
   {
   "State": "New York",
   "Products": [
      {
          "Product": "Banana"
      }
    ]
   }
  ]
 },
 {
  "Name": "Jane",
  "States": [
   {
   "State": "New York",
   "Products": [
     {
      "Product": "Apple"
     }
    ]
   }
  ]
 }

Мне удалось получить один уровень вложенности (Штаты).Как бы вы вложили второй уровень?

Вот блик стека: https://stackblitz.com/edit/angular-lu6zj2

this.grouped_data = this.data.reduce((data, item) => {
  data[item.Name] = data[item.Name] || { Name: item.Name, States: []}
  data[item.Name].States.push(item) 
  return data;
}, {})

1 Ответ

2 голосов
/ 04 июня 2019

let data = [
  { "State": "New York", "Name": "Jane", "Product": "Apple" },
  { "State": "New York", "Name": "Jill", "Product": "Banana"},
  { "State": "California", "Name": "Jill", "Product": "Apple" },
  { "State": "California", "Name": "Jill", "Product": "Banana"}
];

let grouped = data.reduce((p, n) => {
  // Create the Lady
  if (!p[n.Name]) p[n.Name] = { States: [] };
  // Check if the state exists, if not create it, then push product into it
  if (!p[n.Name].States.some(state => state.State === n.State)) {
    p[n.Name].States.push({ State: n.State, Products: [n.Product] });
  } else {
    !p[n.Name].States.find(state => state.State === n.State).Products.push(n.Product);
  }
  return p;
}, {});

console.log(grouped);

После этого вы также можете удалить дубликаты продуктов, если хотите. Я дам тебе разобраться с этим!

РЕДАКТИРОВАТЬ Я не уважал вашу модель, что я за тупица ... Вот она:

let data = [
  { "State": "New York", "Name": "Jane", "Product": "Apple" },
  { "State": "New York", "Name": "Jill", "Product": "Banana"},
  { "State": "California", "Name": "Jill", "Product": "Apple" },
  { "State": "California", "Name": "Jill", "Product": "Banana"}
];

let grouped = data.reduce((p, n) => {
  // Create the Lady
  if (!p.some(lady => lady.Name === n.Name)) p.push({ Name: n.Name, States: [] });
  let lady = p.find(lady => lady.Name === n.Name);
  // Check if the state exists, if not create it, then push product into it
  if (!lady.States.some(state => state.State === n.State)) {
    lady.States.push({ State: n.State, Products: [n.Product] });
  } else {
    lady.States.find(state => state.State === n.State).Products.push(n.Product);
  }
  return p;
}, []);

console.log(grouped);
...