Javascript 使用array.reduce()的复杂嵌套分组
您好,我正在尝试使用array.reduce()为以下场景获得正确的分组: 以下是我的起始阵列:Javascript 使用array.reduce()的复杂嵌套分组,javascript,node.js,Javascript,Node.js,您好,我正在尝试使用array.reduce()为以下场景获得正确的分组: 以下是我的起始阵列: { { descriptionFunction: "Change", processDate: "2019-12-12", transactionEffectiveDate: "2019-12-12",
{
{
descriptionFunction: "Change",
processDate: "2019-12-12",
transactionEffectiveDate: "2019-12-12",
policyEffectiveDate: "2019-09-09",
policyExpirationDate: "2020-09-09",
documentID: "1234"
},
{
descriptionFunction: "Change",
processDate: "2019-12-06",
transactionEffectiveDate: "2019-12-07",
policyEffectiveDate: "2019-09-09",
policyExpirationDate: "2020-09-09",
documentID: "1235"
},
{
descriptionFunction: "Change",
processDate: "2019-11-29",
transactionEffectiveDate: "2019-11-29",
policyEffectiveDate: "2018-09-09",
policyExpirationDate: "2019-09-09",
documentID: "1236"
},
{
descriptionFunction: "Change",
processDate: "2019-11-29",
transactionEffectiveDate: "2019-11-29",
policyEffectiveDate: "2018-09-09",
policyExpirationDate: "2019-09-09",
documentID: "1237"
}
}
以下是我需要想到的:
{
"policyEffectiveDate": "2019-09-09",
"policyExpirationDate": "2020-09-09",
"transactions": [
{
"transactionEffectiveDate": "2019-12-12",
"descriptionFunction": "Change",
"documents": [
{
"descriptionSubType": "Policy",
"documentID": "1234"
}
]
},
{
"transactionEffectiveDate": "2019-12-07",
"descriptionFunction": "Change",
"documents": [
{
"descriptionSubType": "Policy",
"documentID": "1235"
}
]
}
]
},
{
"policyEffectiveDate": "2018-09-09",
"policyExpirationDate": "2019-09-09",
"transactions": [
{
"transactionEffectiveDate": "2018-11-29",
"descriptionFunction": "Change",
"documents": [
{
"descriptionSubType": "Policy",
"documentID": "1236"
},
{
"descriptionSubType": "Policy",
"documentID": "1237"
}
]
}
]
}
因此,输出中有两组,第一组按policyEffectiveDate和policyExpirationDate,第二组按transactionEffectiveDate。我正在努力找出如何使用array.reduce结构实现复杂分组。这里有一些您可以使用的东西:)
const searchArray=[
{
descriptionFunction:“更改”,
处理日期:“2019-12-12”,
交易生效日期:“2019-12-12”,
保单生效日期:“2019-09-09”,
保单到期日期:“2020-09-09”,
documentID:“1234”,
},
{
descriptionFunction:“更改”,
处理日期:“2019-12-06”,
交易生效日期:“2019-12-07”,
保单生效日期:“2019-09-09”,
保单到期日期:“2020-09-09”,
documentID:“1235”,
},
{
descriptionFunction:“更改”,
处理日期:“2019-11-29”,
交易生效日期:“2019-11-29”,
政策生效日期:“2018-09-09”,
保单到期日期:“2019-09-09”,
documentID:“1236”,
},
{
descriptionFunction:“更改”,
处理日期:“2019-11-29”,
交易生效日期:“2019-11-29”,
政策生效日期:“2018-09-09”,
保单到期日期:“2019-09-09”,
documentID:“1237”,
},
];
const arr=searchArray.reduce((acc,child)=>{
//您需要检查“acc”是否包含子数组的策略日期的子数组。
//所以
让policyDate=acc.find(
(ch)=>
ch.policyEffectiveDate==child.policyEffectiveDate&&
ch.policyExpirationDate==child.policyExpirationDate
);
//如果找不到,创建一个并将其推到“acc”`
如果(!保单日期){
保单日期={
policyEffectiveDate:child.policyEffectiveDate,
policyExpirationDate:child.policyExpirationDate,
交易:[],
};
acc.push(保单日期);
}
//在此之后,我们将查看policyDate.transactions,如果有
//数据包含“transactionEffectiveDate”和“descriptionFunction”`
让transactionData=policyDate.transactions.find(
(ch)=>
ch.transactionEffectiveDate==child.transactionEffectiveDate&&
ch.descriptionFunction==子.descriptionFunction
);
//我们要再次检查这个物体是否在那里
如果(!transactionData){
//如果没有,请为我们创建一个
transactionData={
transactionEffectiveDate:child.transactionEffectiveDate,
descriptionFunction:child.descriptionFunction,
文件:[],
};
policyDate.transactions.push(transactionData);
}
//在此之后,我们将推送transactionData.documents
transactionData.documents.push({
//既然child.descriptionSubType不存在,我们可以这样做吗?
//我看不到您在哪里找到“descriptionSubType”`
descriptionSubType:child.descriptionSubType | |“策略”,
documentID:child.documentID,
});
返回acc;
}, []);
控制台日志(arr);
尝试使用for循环
试着去做。这很容易。您将学到很多。您可以通过获取用于凿孔的键数组和用于实际标高的其他键,以及嵌套数组中的键来指定所需的嵌套 这适用于任意计数的嵌套级别进行分组
var数据=[{描述函数:“变更”,处理日期:“2019-12-12”,交易生效日期:“2019-12-12”,保单生效日期:“2019-09-09”,保单到期日期:“2020-09-09”,文档ID:“1234”},{描述函数:“变更”,处理日期:“2019-12-06”,交易生效日期:“2019-12-07”,保单生效日期:“2019-09-09”,policyExpirationDate:“2020-09-09”,documentID:“1235”},{描述函数:“更改”,处理日期:“2019-11-29”,交易生效日期:“2019-11-29”,policyEffectiveDate:“2018-09-09”,policyExpirationDate:“2019-09-09”,documentID:“1236”},{描述函数:“更改”,处理日期:“2019-11-29”,交易生效日期:“2019-11-29”,保单生效日期:“2018-09-09”,保单到期日期:“2019-09-09”,文档ID:“1237”},
组=[
['policyEffectiveDate','policyExpirationDate','transactions'],
['transactionEffectiveDate','descriptionFunction','documents'],
[未定义,'documentID',未定义]
],
结果=数据。减少((r,o)=>{
groups.reduce((p,[组,…属性])=>{
函数setProperties(目标={}){
forEach(k=>target[k]=o[k]);
回报目标;
}
var collection=properties.pop(),
临时雇员
如果(!组){
p、 push(setProperties());
返回[];
}
temp=p.find(q=>o[group]==q[group]);
如果(!temp){
p、 push(temp=setProperties({[group]:o[group]}));
临时[收集]=[];
}
返回温度[收集];
},r)
返回r;
}, []);
console.log(结果);
.as控制台包装{最大高度:100%!重要;顶部:0;}
单个文档的解决方案:
const事务=[{
descriptionFunction:“更改”,
处理日期:“2019-12-12”,
交易生效日期:“2019-12-12”,
保单生效日期:“2019-09-09”,
保单到期日期:“2020-09-09”,
文档ID:“1234”
}, {
descriptionFunction:“更改”,
处理日期:“2019-12-06”,
交易生效日期:“2019-12-07”,
保单生效日期:“2019-09-09”,
保单到期日期:“2020-09-09”,
文档ID: