Javascript 如何通过主键对数组中的所有数据项进行分组并收集组中的所有数据项来重新构造数组中的所有数据项';是否将其余条目作为分组值列表?

Javascript 如何通过主键对数组中的所有数据项进行分组并收集组中的所有数据项来重新构造数组中的所有数据项';是否将其余条目作为分组值列表?,javascript,arrays,typescript,data-structures,reduce,Javascript,Arrays,Typescript,Data Structures,Reduce,我在按键合并数组中的对象以及对数组中具有相同键的值进行分组时遇到问题。例如: a=[{ 关键:“1”, 价值:“a”, 价值2:“b” }, { 键:“2”, 价值:“a”, 价值2:“b” }, { 关键:“1”, 值:“b”, 价值2:“a” }, { 关键:“1”, 值:“c”, 价值2:“d” }] 我希望取得的成果是: [{ 关键:“1”, 值:[“a”、“b”、“c”], 价值2:[“b”、“a”、“d”] }, { 键:“2”, 值:[“a”], 值2:[“b”] }] 有没有

我在按键合并数组中的对象以及对数组中具有相同键的值进行分组时遇到问题。例如:

a=[{
关键:“1”,
价值:“a”,
价值2:“b”
}, {
键:“2”,
价值:“a”,
价值2:“b”
}, {
关键:“1”,
值:“b”,
价值2:“a”
}, {
关键:“1”,
值:“c”,
价值2:“d”
}]
我希望取得的成果是:

[{
关键:“1”,
值:[“a”、“b”、“c”],
价值2:[“b”、“a”、“d”]
}, {
键:“2”,
值:[“a”],
值2:[“b”]
}]
有没有人在javascript/typescript中有一个简单的解决方案

我读过很多关于类似问题的文章,但没有一篇与上面的文章完全相同


提前谢谢

你可以这样试试。它首先将数据简化为基于关键点的对象,然后将其转换为数组

var a=[{key:“1”,value:“a”,value2:“b”},{key:“2”,value:“a”,value2:“b”},{key:“1”,value:“b”,value2:“a”},{key:“1”,value:“c”,value2:“d”}]
a=a.减少((acc,curr)=>{
如果(!acc[当前键]){
acc[curr.key]={value:[curr.value],value2:[curr.value2]};
}否则{
acc[curr.key].value.push(curr.value);
acc[curr.key].value2.push(curr.value2);
}
返回acc;
}, {});
a=Object.entries(a.map)([key,value])=>({key,…value}))

控制台日志(a)您可以这样尝试。它首先将数据简化为基于关键点的对象,然后将其转换为数组

var a=[{key:“1”,value:“a”,value2:“b”},{key:“2”,value:“a”,value2:“b”},{key:“1”,value:“b”,value2:“a”},{key:“1”,value:“c”,value2:“d”}]
a=a.减少((acc,curr)=>{
如果(!acc[当前键]){
acc[curr.key]={value:[curr.value],value2:[curr.value2]};
}否则{
acc[curr.key].value.push(curr.value);
acc[curr.key].value2.push(curr.value2);
}
返回acc;
}, {});
a=Object.entries(a.map)([key,value])=>({key,…value}))
控制台日志(a)
设a=[{key:“1”,value:“a”,value2:“b”},{key:“2”,value:“a”,value2:“b”},{key:“1”,value:“b”,value2:“a”},{key:“1”,value:“c”,value2:“d”}]
const result=a.reduce((res,item)=>{
让trans=res.find(e=>e.key==item.key)| | res.push(item)&&item;
Object.entries(item.map)([key,val])=>{
如果(键!=“键”){
trans[key]=Array.isArray(trans[key])?[…trans[key],val]:[val];
}
});
返回res;
}, []);
console.log('result',result)
设a=[{key:“1”,value:“a”,value2:“b”},{key:“2”,value:“a”,value2:“b”},{key:“1”,value:“b”,value2:“a”},{key:“1”,value:“c”,value2:“d”}]
const result=a.reduce((res,item)=>{
让trans=res.find(e=>e.key==item.key)| | res.push(item)&&item;
Object.entries(item.map)([key,val])=>{
如果(键!=“键”){
trans[key]=Array.isArray(trans[key])?[…trans[key],val]:[val];
}
});
返回res;
}, []);

console.log('result',result)通用方法的实现方式仅考虑公共转换任务的主要数据结构。对于(最终)分组键,它总是不可知的,但它确实为后者实现了一个配置选项

因此,我们可能会提出一种基于两种方法的方法,一种是通过提供的组-
值收集组,另一种是将条目值收集到(分组的)列表中

函数collectEntryValueAsListItem(累加器,条目){
常量[键,值]=条目;
常量值列表=累加器[键]| |(累加器[键]=[]);
valueList.push(值);
回流蓄能器;
}
函数组DataByKeyandCollectionEntryValues(收集器,项){
const{key,index,list}=收集器;
const groupKey=项[key];
设groupItem=index[groupKey];
如果(!groupItem){
groupItem=索引[groupKey]={[key]:groupKey};
list.push(groupItem);
}
item=Object.assign({},item);
删除项目[键];
对象
.参赛作品(项目)
.减少(collectEntryValueAsListItem、groupItem);
回程收集器;
}
常量样本列表=[
{键:“1”,值:“a”,值2:“b”},
{键:“2”,值:“a”,值2:“b”},
{键:“1”,值:“b”,值2:“a”},
{键:“1”,值:“c”,值2:“d”},
];
console.log(
“…OP想要的结果…”,
sampleList.reduce(GroupDataByKeyandCollectionEntryValues{
键:“键”,
索引:{},
名单:[],
}).名单
);
console.log(
“…通用reduce方法的第二个证明…”,
sampleList.reduce(GroupDataByKeyandCollectionEntryValues{
键:“值”,
索引:{},
名单:[],
}).名单
);
console.log(
“…通用reduce方法的第三个证明…”,
sampleList.reduce(GroupDataByKeyandCollectionEntryValues{
键:'value2',
索引:{},
名单:[],
}).名单
);

.as console wrapper{min height:100%!important;top:0;}
一种通用方法的实现方式是只考虑公共转换任务的主数据结构。对于(最终)分组键,它总是不可知的,但它确实为后者实现了一个配置选项

因此,我们可能会提出一种基于两种方法的方法,一种是通过提供的组-
值收集组,另一种是将条目值收集到(分组的)列表中

函数collectEntryValueAsListItem(累加器,条目){
常量[键,值]=条目;
常量值列表=累加器[键]| |(累加器[键]=[]);
valueList.push(值);
回流蓄能器;
}
函数组DataByKeyandCollectionEntryValues(收集器,项){
const{key,index,list}=收集器;
const groupKey=项[key];
设groupItem=index[groupKey];
如果(!groupItem){
groupItem=索引[groupKey]={[key]:groupKey};