合并匹配元素并迭代并分离出集合中的非匹配元素
Consolidate matching elements and iterate and separate out elements non matching elements in a collection
我是 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' }
]
const {groupBy, values, merge} = require('lodash');
// input...
const output = values(
groupBy(input, 'id')
).map(chunks => merge(...chunks));
总体上更好的方法是 将那些 date/time/locations 转换为数组 。但是考虑到当前的问题可以做这样的事情:
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>
我是 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' }
]
const {groupBy, values, merge} = require('lodash');
// input...
const output = values(
groupBy(input, 'id')
).map(chunks => merge(...chunks));
总体上更好的方法是 将那些 date/time/locations 转换为数组 。但是考虑到当前的问题可以做这样的事情:
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>