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