Группировать данные с помощью js

#javascript #arrays

#javascript #массивы

Вопрос:

У меня проблема, нужно сгруппировать некоторые данные.
Стоит упомянуть, что я использую underscore.js библиотека, но все, что угодно или любая помощь, поможет мне.
Также стоит упомянуть, что я работаю с node.js . Я бы очень хотел, чтобы кто-нибудь мне помог, потому что правда в том, что я совсем потерялся, и я уже пробовал и пробовал библиотеки, но я не могу найти что-то, что мне действительно помогает. Я думаю, мне нужно сделать группировку с помощью ._grouby, но это не привело ни к чему.

 const data = 
  [ { Nombre: 'Juan 2',    Fecha: '26/09/20', Seccion: 1, Detalle: { Colores: 'Dark',   Valor: 'B1' }} 
  , { Nombre: 'Juan',      Fecha: '25/09/20', Seccion: 1, Detalle: { Colores: 'Light',  Valor: 'A1' }} 
  , { Nombre: 'Alberto 2', Fecha: '21/09/20', Seccion: 2, Detalle: { Colores: 'Blue',   Valor: 'O1' }} 
  , { Nombre: 'Alberto',   Fecha: '22/09/20', Seccion: 2, Detalle: { Colores: 'Orange', Valor: 'F9' }} 
  ] 

const expected_result = 
  [ 
    { Nombre: 'Juan 2'
    , Fecha: '26/09/20'
    , Seccion: 1
    , Detalle: 
      [ { Colores: 'Dark',  Valor: 'B1' } 
      , { Colores: 'Light', Valor: 'A1' } 
      ] 
    } 
  , { Nombre: 'Alberto 2'
    , Fecha: '21/09/20'
    , Seccion: 2
    , Detalle: 
      [ { Colores: 'Blue',   Valor: 'O1' } 
      , { Colores: 'Orange', Valor: 'F9' } 
      ] 
    } 
  ]
  

Комментарии:

1. совет, выполните цикл над ним, создайте объект , ключ которого является значением Seccion , создайте или добавьте текущий элемент в массив детализации, затем выполните Object.values, чтобы получить конечный результат .. или повторите цикл и просматривайте каждый раз в текущем / результирующем массиве, что менее эффективно.

2. Это какая-то головоломка, для которой нам нужно выяснить ваши критерии группировки? Потому что это действительно неочевидно, и вы этого не описали.

Ответ №1:

что я могу сказать? бесплатный код ?

 const data = 
  [ { Nombre: 'Juan 2',    Fecha: '26/09/20', Seccion: 1, Detalle: { Colores: 'Dark',   Valor: 'B1' }} 
  , { Nombre: 'Juan',      Fecha: '25/09/20', Seccion: 1, Detalle: { Colores: 'Light',  Valor: 'A1' }} 
  , { Nombre: 'Alberto 2', Fecha: '21/09/20', Seccion: 2, Detalle: { Colores: 'Blue',   Valor: 'O1' }} 
  , { Nombre: 'Alberto',   Fecha: '22/09/20', Seccion: 2, Detalle: { Colores: 'Orange', Valor: 'F9' }} 
  ] 

const res = data.reduce((a,{ Detalle, ...rest } )=>
  {
  let el = a.find(x=>x.Seccion===rest.Seccion)
  if(!el) a.push(  el = {...rest, Detalle: [] });
  el.Detalle.push({...Detalle})
  return a
  },[])

console.log( JSON.stringify(res,0,2))  
 .as-console-wrapper { max-height: 100% !important; top: 0; }  

с помощью Defectos :

 const res = data.reduce((a,{ Detalle, Defectos, ...rest } )=>
  {
  let el = a.find(x=>x.Seccion===rest.Seccion)
  if(!el) a.push(  el = {...rest, Detalle: [], Defectos: [] });
  el.Detalle.push({...Detalle})
  el.Defectos.push({...Defectos})
  return a
  },[])
  

Комментарии:

1. Спасибо, мистер Джоджо, ваш код, ваш код решил мою проблему. !!! Большое спасибо. Итак, что, если у меня есть другое поле в качестве «Detalle», назовем его «Defectos», и оно также будет похоже на «Detalle», как бы я заполнил его вместе с деталями? Я имею в виду заполнить «Детали» и «Дефекты»