问题描述
我们有一个长度约为 40K 的数组,这些是与外部系统同步的失败数据。外部系统需要基于 id 的子数组数组形式的数据,并从主数组本身按创建日期 asc 排序。每个 id
在源系统中可能有多个故障,而 "data":{}
在主数组的每个记录中都是不同的。
是否有任何库可以有效地实现结果?因为,这必须每天运行。
let customerData = [
{
"id": 1,"data": {},"createdDate": ""
},{
"id": 1,{
"id": 2,{
"id": 3,{
"id": 4,"createdDate": ""
}
];
并且预期的数据应该如下所示发送到外部系统。
let modifiedData = [
[
{
"id": 1,"createdDate": ""
},{
"id": 1,"createdDate": ""
}
],[
{
"id": 2,{
"id": 2,[
{
"id": 3,[
{
"id": 4,{
"id": 4,"createdDate": ""
}
]
]
解决方法
为此我们可以使用 lodash 函数 _.groupBy。我们按id分组,然后用Object.values得到结果为一个数组:
const customerData = [ { "id": 1,"data": {},"createdDate": "" },{ "id": 1,{ "id": 2,{ "id": 3,{ "id": 4,"createdDate": "" } ];
const result = Object.values( _.groupBy(customerData,'id'));
console.log("Result:",result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>
我们也可以通过使用 Array.reduce 的 vanilla JavaScript 来做到这一点,创建一个以 id
为键的地图,然后再次使用 Object.values。
const customerData = [ { "id": 1,"createdDate": "" } ];
const result = Object.values(customerData.reduce((acc,curr) => {
if (!acc[curr.id]) acc[curr.id] = [];
acc[curr.id].push(curr);
return acc;
},{}))
console.log("Result:",result)