Консолидация соответствующих элементов, итерация и выделение элементов, не соответствующих элементам в коллекции - PullRequest
0 голосов
/ 16 ноября 2018

Я новичок в Node \ JS и застрял на том, как объединить совпадающие элементы и итерировать несоответствующие элементы в сборе, создавая новую коллекцию. До сих пор я использовал lodash для группировки данных, которые вставляются (сгруппированный ввод) ниже, но не могу понять, как получить желаемый вывод.

Я открыт для использования lodash \ underscore \ javascript или любой другой библиотеки, совместимой с Node.

Спасибо за вашу помощь и предложения.

Grouped Input:

[ { mod_AccountNumber: '0001',
    mod_Id: '123456',
    mod_LastName: 'SMITH',
    mod_FirstName: 'NANCY',
    mod_AppointmentLocation: 'ROOM10',
    mod_AppointmentDate: '10/26/18',
    mod_AppointmentTime: '0900' },
  { mod_AccountNumber: '0001',
    mod_Id: '123456',
    mod_LastName: 'SMITH',
    mod_FirstName: 'NANCY',
    mod_AppointmentLocation: 'ROOM11',
    mod_AppointmentDate: '10/26/18',
    mod_AppointmentTime: '0930' },
  { mod_AccountNumber: '0001',
    mod_Id: '654321',
    mod_LastName: 'JONES',
    mod_FirstName: 'NATASHA',
    mod_AppointmentLocation: 'ROOM11',
    mod_AppointmentDate: '10/26/18',
    mod_AppointmentTime: '0930' },
  { mod_AccountNumber: '0001',
    mod_Id: '654321',
    mod_LastName: 'JONES',
    mod_FirstName: 'NATASHA',
    mod_AppointmentLocation: 'ROOM12',
    mod_AppointmentDate: '10/26/18',
    mod_AppointmentTime: '1015' }
]

Desired Output:

[ { mod_AccountNumber: '0001',
    mod_Id: '123456',
    mod_LastName: 'SMITH',
    mod_FirstName: 'NANCY',
    mod_AppointmentLocation_1: 'ROOM10',
    mod_AppointmentTime_1:'0900',
    mod_AppointmentLocation_2: 'ROOM11',
    mod_AppointmentTime_2:'0930' },
  { mod_AccountNumber: '0001',
    mod_Id: '654321',
    mod_LastName: 'JONES',
    mod_FirstName: 'NATASHA',
    mod_AppointmentLocation_1: 'ROOM11',
    mod_AppointmentTime_1:'0930',
    mod_AppointmentLocation_2: 'ROOM12',
    mod_AppointmentTime_2:'1015' }
]

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

В целом лучше всего было бы преобразовать в массив эти дату / время / местоположения.Но, учитывая текущий вопрос, можно сделать что-то вроде этого:

const data = [{ mod_AccountNumber: '0001', mod_Id: '123456', mod_LastName: 'SMITH', mod_FirstName: 'NANCY', mod_AppointmentLocation: 'ROOM10', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '0900' }, { mod_AccountNumber: '0001', mod_Id: '123456', mod_LastName: 'SMITH', mod_FirstName: 'NANCY', mod_AppointmentLocation: 'ROOM11', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '0930' }, { mod_AccountNumber: '0001', mod_Id: '654321', mod_LastName: 'JONES', mod_FirstName: 'NATASHA', mod_AppointmentLocation: 'ROOM11', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '0930' }, { mod_AccountNumber: '0001', mod_Id: '654321', mod_LastName: 'JONES', mod_FirstName: 'NATASHA', mod_AppointmentLocation: 'ROOM12', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '1015' } ]

const result = _(data)
 .groupBy('mod_Id')
 .values()
 .map(x => _.values(_.transform(x, (r,c,i) => {
   r[c.mod_Id] = _.extend(r[c.mod_Id], {
   mod_Id: c.mod_Id,
   mod_AccountNumber: c.mod_AccountNumber,
   mod_LastName: c.mod_LastName,
   mod_FirstName: c.mod_FirstName,
   [`mod_AppointmentLocation${i+1}`]: c.mod_AppointmentLocation,
   [`mod_AppointmentDate${i+1}`]: c.mod_AppointmentDate,
   [`mod_AppointmentTime${i+1}`]: c.mod_AppointmentTime,
 })}, {})))
 .flatten()
 .value()

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Идея состоит в том, чтобы сначала сгруппировать по mod_Id, а затем пропустить values map через них и transform до одного объекта.Поскольку вы вернулись в форму объекта, вы получаете values и, наконец, flatten массив.

Несколько проще подходить к ES6 с чем-то вроде этого:

const data = [{ mod_AccountNumber: '0001', mod_Id: '123456', mod_LastName: 'SMITH', mod_FirstName: 'NANCY', mod_AppointmentLocation: 'ROOM10', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '0900' }, { mod_AccountNumber: '0001', mod_Id: '123456', mod_LastName: 'SMITH', mod_FirstName: 'NANCY', mod_AppointmentLocation: 'ROOM11', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '0930' }, { mod_AccountNumber: '0001', mod_Id: '654321', mod_LastName: 'JONES', mod_FirstName: 'NATASHA', mod_AppointmentLocation: 'ROOM11', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '0930' }, { mod_AccountNumber: '0001', mod_Id: '654321', mod_LastName: 'JONES', mod_FirstName: 'NATASHA', mod_AppointmentLocation: 'ROOM12', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '1015' } ]

const result = Object.values(data.reduce((r, c, i) => {
  let _x = r[c.mod_Id] ? r[c.mod_Id]._x : 0
  _x++
  r[c.mod_Id] = Object.assign(r[c.mod_Id] || {}, {
    mod_Id: c.mod_Id,
    mod_AccountNumber: c.mod_AccountNumber,
    mod_LastName: c.mod_LastName,
    mod_FirstName: c.mod_FirstName,
    [`mod_AppointmentLocation${_x}`]: c.mod_AppointmentLocation,
    [`mod_AppointmentDate${_x}`]: c.mod_AppointmentDate,
    [`mod_AppointmentTime${_x}`]: c.mod_AppointmentTime,
    _x
  })
  return r
}, {})).map(({_x, ...rest}) => rest)
console.log(result)

Единственное предостережение заключается в том, что этот подход не является чистым, поскольку он отслеживает текущий номер элемента путем изменения объекта со свойством _x, которое в конце равнос помощью map

В случае, если вы хотите рассмотреть вопрос о том, что делать с массивом, все становится намного проще:

const data = [{ mod_AccountNumber: '0001', mod_Id: '123456', mod_LastName: 'SMITH', mod_FirstName: 'NANCY', mod_AppointmentLocation: 'ROOM10', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '0900' }, { mod_AccountNumber: '0001', mod_Id: '123456', mod_LastName: 'SMITH', mod_FirstName: 'NANCY', mod_AppointmentLocation: 'ROOM11', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '0930' }, { mod_AccountNumber: '0001', mod_Id: '654321', mod_LastName: 'JONES', mod_FirstName: 'NATASHA', mod_AppointmentLocation: 'ROOM11', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '0930' }, { mod_AccountNumber: '0001', mod_Id: '654321', mod_LastName: 'JONES', mod_FirstName: 'NATASHA', mod_AppointmentLocation: 'ROOM12', mod_AppointmentDate: '10/26/18', mod_AppointmentTime: '1015' } ]

const result = _.chain(data)
  .reduce((r,c,i) => {
  r[c.mod_Id] = r[c.mod_Id] ? r[c.mod_Id] : {
    mod_Id: c.mod_Id,
    mod_AccountNumber: c.mod_AccountNumber,
    mod_LastName: c.mod_LastName,
    mod_FirstName: c.mod_FirstName,
    schedule: []
  }
  r[c.mod_Id].schedule.push({
    mod_AppointmentLocation: c.mod_AppointmentLocation,
    mod_AppointmentDate: c.mod_AppointmentDate,
    mod_AppointmentTime: c.mod_AppointmentTime
  })
  return r
 }, {})
 .values()
 .value()
 
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
0 голосов
/ 16 ноября 2018
const {groupBy, values, merge} = require('lodash');
// input...
const output = values(
    groupBy(input, 'id')
).map(chunks => merge(...chunks));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...