Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要一种在javascript中对对象数组进行分组的有效方法吗_Javascript_Arrays_Object - Fatal编程技术网

需要一种在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”,
添加