需要一种在javascript中对对象数组进行分组的有效方法吗
有没有方法通过引用数组中对象的特定值来对对象数组进行分组 假设我有一个名为需要一种在javascript中对对象数组进行分组的有效方法吗,javascript,arrays,object,Javascript,Arrays,Object,有没有方法通过引用数组中对象的特定值来对对象数组进行分组 假设我有一个名为 a=[ {name: "abc", address: "xxx"} {name: "def", address: "yyy"} {name: "xyz", address: "xyz"} {name: "abc", address1: "123"} {name: "def", address1: "456"} ] 我需要将相同名称的地址添加到一个对象中,新数组应该如下所示 b =[ {name:"abc", addre
a=[
{name: "abc", address: "xxx"}
{name: "def", address: "yyy"}
{name: "xyz", address: "xyz"}
{name: "abc", address1: "123"}
{name: "def", address1: "456"}
]
我需要将相同名称的地址添加到一个对象中,新数组应该如下所示
b =[
{name:"abc", address: "xxx", address1: "123"}
{name:"def", address: "yyy", address1: "456"}
{name: "xyz", address: "xyz"}
]
您可以使用函数
reduce
按名称分组,使用函数Object.values
提取分组的对象
a=[{name:“abc”,address:“xxx”},{name:“def”,address:“yyy”},{name:“xyz”,address:“xyz”},{name:“abc”,address1:“123”},{name:“def”,address1:“456”},
result=Object.values(a.reduce((a,{name,…rest})=>{
a[name]=Object.assign(a[name]|{name},rest);
返回a;
},Object.create(null));
控制台日志(结果)代码>
.as console wrapper{max height:100%!important;top:0;}
您可以使用函数reduce
按名称分组,并使用函数Object.values
提取分组的对象
a=[{name:“abc”,address:“xxx”},{name:“def”,address:“yyy”},{name:“xyz”,address:“xyz”},{name:“abc”,address1:“123”},{name:“def”,address1:“456”},
result=Object.values(a.reduce((a,{name,…rest})=>{
a[name]=Object.assign(a[name]|{name},rest);
返回a;
},Object.create(null));
控制台日志(结果)代码>
.as console wrapper{max height:100%!important;top:0;}
您可以利用来跟踪值并使用该方法删除值您可以利用来跟踪值并使用该方法删除值我知道您已经有了一个很好的答案,但我想向您展示另一种方法
我会将它保存为一个键,而不是address1等等,并使用他的值作为所有地址的列表
因此,您的结果如下所示:
[ { name: 'abc', address: [ 'xxx', '123' ] },
{ name: 'def', address: [ 'yyy', '456' ] },
{ name: 'xyz', address: [ 'xyz' ] } ]
a=[
{姓名:“abc”,地址:“xxx”},
{名称:“def”,地址:“yyy”},
{名称:“xyz”,地址:“xyz”},
{姓名:“abc”,地址:“123”},
{姓名:“def”,地址:“456”}
]
新数组=a.reduce((agg,item)=>{
const index=agg.findIndex(find_item=>find_item.name==item.name)
如果(索引!=-1){
agg[index].address.push(item.address)
}否则{
聚合推送({name:item.name,地址:[item.address]})
}
返回agg
},[])
console.log(新的_数组)
/*
[{姓名:'abc',地址:['xxx','123']},
{name:'def',地址:['yyy','456']},
{名称:'xyz',地址:['xyz']}]
*/
我知道你已经有了一个很好的答案,但我想告诉你另一种方法
我会将它保存为一个键,而不是address1等等,并使用他的值作为所有地址的列表
因此,您的结果如下所示:
[ { name: 'abc', address: [ 'xxx', '123' ] },
{ name: 'def', address: [ 'yyy', '456' ] },
{ name: 'xyz', address: [ 'xyz' ] } ]
a=[
{姓名:“abc”,地址:“xxx”},
{名称:“def”,地址:“yyy”},
{名称:“xyz”,地址:“xyz”},
{姓名:“abc”,地址:“123”},
{姓名:“def”,地址:“456”}
]
新数组=a.reduce((agg,item)=>{
const index=agg.findIndex(find_item=>find_item.name==item.name)
如果(索引!=-1){
agg[index].address.push(item.address)
}否则{
聚合推送({name:item.name,地址:[item.address]})
}
返回agg
},[])
console.log(新的_数组)
/*
[{姓名:'abc',地址:['xxx','123']},
{name:'def',地址:['yyy','456']},
{名称:'xyz',地址:['xyz']}]
*/
您可以使用“”和“”来实现此目的,如下所示
var a=[
{姓名:“abc”,地址:“xxx”}
,{名称:“def”,地址:“yyy”}
,{名称:“xyz”,地址:“xyz”}
,{姓名:“abc”,地址1:“123”}
,{name:“def”,address1:“456”}
]
var结果=对象值(a.reduce(
(o,d)=>(
o[d.name]={……d,…(o[d.name]&&o[d.name])}
,o
)
, {})
)
console.log(result)
您可以使用“”和“”来实现此目的,如下所示
var a=[
{姓名:“abc”,地址:“xxx”}
,{名称:“def”,地址:“yyy”}
,{名称:“xyz”,地址:“xyz”}
,{姓名:“abc”,地址1:“123”}
,{name:“def”,address1:“456”}
]
var结果=对象值(a.reduce(
(o,d)=>(
o[d.name]={……d,…(o[d.name]&&o[d.name])}
,o
)
, {})
)
console.log(result)
这是一种解决整个问题的功能性方法。查看评论以了解其工作原理
const a=[{
名称:“abc”,
地址:“xxx”
}, {
名称:“def”,
地址:“yyy”
}, {
名称:“xyz”,
地址:“xyz”
}, {
名称:“abc”,
地址:“123”
}, {
名称:“def”,
地址:“456”
}]
常量map=f=>xs=>xs.map(f)
constpipe=xs=>x=>
x.reduce((x,f)=>f(x,x)
const objectFromEntries=xs=>
xs.reduce((o[prop,value])=>({…o[prop]:value}),{})
constgroupby=prop=>xs=>
xs.reduce((o,x)=>
({…o[x[prop]]:[…(o[x[prop]]| |[]),x]})
, [])
const addressPairs=map({address},i)=>
[`地址${i+1}`,地址]
)
const organizeByName=管道([
groupBy('name'),//(1)按名称对整个对象进行分组
Object.entries,//(2)将组转换为成对
map(([name,xs])=>/(3)展平组条目的地址
['name',name],…地址对(xs)]
),
映射(objectFromEntries)//(4)将每个展平的组转化为一个对象
])
常量输出=organizeByName(a)
console.log(output)
这是一种解决整个问题的功能性方法。查看评论以了解其工作原理
const a=[{
名称:“abc”,
地址:“xxx”
}, {
名称:“def”,
地址:“yyy”
}, {
名称:“xyz”,
地址:“xyz”
}, {
名称:“abc”,
地址:“123”
}, {
名称:“def”,
添加