Javascript将数组转换为使用array属性键控的映射,并将相应的重复键值存储为array

Javascript将数组转换为使用array属性键控的映射,并将相应的重复键值存储为array,javascript,arrays,ecmascript-6,hashmap,Javascript,Arrays,Ecmascript 6,Hashmap,我有一个数组,它有一些对象,对象的一个属性可以有两个对象,即。账户现在,我想将这个数组转换为具有帐户属性值的键的映射,并且对应的副本应该作为映射中该键的数组存储 让arr=[]; arr.push({'Key':'1','Record':{'Account':'a','data':'A1'}); arr.push({'Key':'2','Record':{'Account':'b','data':'123'}); arr.push({'Key':'3','Record':{'Account':

我有一个数组,它有一些对象,对象的一个属性可以有两个对象,即。账户现在,我想将这个数组转换为具有帐户属性值的键的映射,并且对应的副本应该作为映射中该键的数组存储

让arr=[];
arr.push({'Key':'1','Record':{'Account':'a','data':'A1'});
arr.push({'Key':'2','Record':{'Account':'b','data':'123'});
arr.push({'Key':'3','Record':{'Account':'a','data':'A2'}});
arr.push({'Key':'4','Record':{'Account':'a','data':'A3'});
arr.push({'Key':'5','Record':{'Account':'c','data':'123'});
const accIdMap=arr.reduce((map,obj)=>(map[obj.Record.Account]=obj,map),{});
控制台日志(arr);

console.log(accIdMap)如果该值已经存在,则在reduce函数中执行检查,然后在此基础上执行以下操作。如果该帐户已存在,则检查映射是否在该帐户的密钥上具有数组。如果没有,则创建一个空数组并将其推到该数组,以使用现有元素和当前元素创建一个数组。如果它是一个数组,那么只需按它。如果帐户密钥不存在,则只需将该值设置为obj

更新:重新排序常量m的初始化并添加代码注释

让arr=[];
arr.push({'Key':'1','Record':{'Account':'a','data':'A1'});
arr.push({'Key':'2','Record':{'Account':'b','data':'123'});
arr.push({'Key':'3','Record':{'Account':'a','data':'A2'}});
arr.push({'Key':'4','Record':{'Account':'a','data':'A3'});
arr.push({'Key':'5','Record':{'Account':'c','data':'123'});
常量accIdMap=arr.reduce((映射,对象)=>{
如果(map[obj.Record.Account]){//该属性存在,可以是数组或obj
如果(!map[obj.Record.Account].length){//仅表示对象。创建一个数组,然后将现有对象推送到该数组
常量m=(映射[obj.Record.Account]);
map[obj.Record.Account]=[];
映射[obj.Record.Account].push(m);
}
map[obj.Record.Account].push(obj);//如果是数组,则将其推送到现有数组。如果不是上一个数组,则创建并插入旧值,此行推送到新数组
}否则{
map[obj.Record.Account]=obj;//只是将obj值放在一起,因为它不是重复的
}
返回图;
}, {});
控制台日志(arr);
console.log(accIdMap)您可以这样使用:

检查
累加器
是否已具有当前
a.Record.Account
的密钥。如果是,将上下文中的当前项推送到它。否则,添加
a.Record.Account
作为一个键,然后将该项推送到它

const input=[{'Key':'1','Record':{'Account':'a','data':'A1'},
{'Key':'2','Record':{'Account':'b','data':'123'},
{'Key':'3','Record':{'Account':'a','data':'A2'},
{'Key':'4','Record':{'Account':'a','data':'A3'},
{'Key':'5','Record':{'Account':'c','data':'123'}]
常量输出=输入。减少((acc,a)=>
((acc[a.Record.Account]=acc[a.Record.Account]| |[])。推送(a),acc),{})

控制台日志(输出)这与您期望的一样。获取此结果并与所需输出匹配

让arr=[];
arr.push({'Key':'1','Record':{'Account':'a','data':'A1'});
arr.push({'Key':'2','Record':{'Account':'b','data':'123'});
arr.push({'Key':'3','Record':{'Account':'a','data':'A2'});
arr.push({'Key':'4','Record':{'Account':'a','data':'A3'});
arr.push({'Key':'5','Record':{'Account':'c','data':'123'});
var obj={}
arr.map((e)=>{
var filteredar=arr.filter((f)=>f.Record.Account==e.Record.Account)
如果(Filteredar.length>1)
obj[e.Record.Account]=筛选程序
else if(Filteredar.length!=0)
obj[e.Record.Account]=筛选数据[0]
})
console.log(JSON.stringify(obj))