Javascript 合并包含数组的对象数组
您好,我想知道如何实现此方法: 我有一组对象:Javascript 合并包含数组的对象数组,javascript,arrays,Javascript,Arrays,您好,我想知道如何实现此方法: 我有一组对象: const array =[{district:1,buildings:["1","2"]},{district:1,buildings:["1","3"]},{district:2,buildings:["1","2"]}] 我想合并阵列中的对象+合并具有相同区域的对象中的建筑 我应该得到什么: const array =[{district:1,buildings:["1","2","3"]},{district:2,buildings:["
const array =[{district:1,buildings:["1","2"]},{district:1,buildings:["1","3"]},{district:2,buildings:["1","2"]}]
我想合并阵列中的对象+合并具有相同区域的对象中的建筑
我应该得到什么:
const array =[{district:1,buildings:["1","2","3"]},{district:2,buildings:["1","2"]}]
任何帮助。谢谢
注意:这可以通过for循环完成,但我正在寻找更简单的方法。您可以这样做:
const数组=[{地区:1,建筑物:[“1”,“2”]},{地区:1,建筑物:[“1”,“3”]},{地区:2,建筑物:[“1”,“2”]};
函数合并(arr){
让结果=[];
arr.forEach(项目=>{
如果(结果[项目区]){
item.buildings.forEach(val=>{result[item.district].add(val)});
}否则{
结果[项目区域]=新设置(项目建筑);
}
})
返回result.filter(item=>item).map((item,i)=>{return{district:i+1,buildings:[…item]});
}
log(合并(数组))代码>您可以这样做:
const数组=[{地区:1,建筑物:[“1”,“2”]},{地区:1,建筑物:[“1”,“3”]},{地区:2,建筑物:[“1”,“2”]};
函数合并(arr){
让结果=[];
arr.forEach(项目=>{
如果(结果[项目区]){
item.buildings.forEach(val=>{result[item.district].add(val)});
}否则{
结果[项目区域]=新设置(项目建筑);
}
})
返回result.filter(item=>item).map((item,i)=>{return{district:i+1,buildings:[…item]});
}
log(合并(数组))
您可以使用Array.prototype.reduce
创建一个对象,该对象将存储特定地区的所有值(地区将是键)
在此之后,您将拥有一个对象,其中关键点作为区域,值作为建筑阵列。然后,您可以使用array.prototype.map
重新创建一个数组,并设置为删除重复项
const数组=[{
地区:1,,
建筑物:[“1”、“2”]
},
{
地区:1,,
建筑物:[“1”、“3”]
},
{
地区:2,,
建筑物:[“1”、“2”]
}
];
让映射的数组=数组.reduce((acc,val)=>{
acc[val.district]=acc[val.district]?
acc[val.district]。concat(val.buildings):
val.建筑物;
返回acc;
}, {});
mapped_array=Object.key(mapped_array.map)(val=>{
返回{
地区:瓦尔,,
建筑物:[…新集合(映射的_数组[val])]
};
});
log(映射的_数组)
您可以使用Array.prototype.reduce
创建一个对象,该对象将存储特定地区的所有值(地区将是键)
在此之后,您将拥有一个对象,其中关键点作为区域,值作为建筑阵列。然后,您可以使用array.prototype.map
重新创建一个数组,并设置为删除重复项
const数组=[{
地区:1,,
建筑物:[“1”、“2”]
},
{
地区:1,,
建筑物:[“1”、“3”]
},
{
地区:2,,
建筑物:[“1”、“2”]
}
];
让映射的数组=数组.reduce((acc,val)=>{
acc[val.district]=acc[val.district]?
acc[val.district]。concat(val.buildings):
val.建筑物;
返回acc;
}, {});
mapped_array=Object.key(mapped_array.map)(val=>{
返回{
地区:瓦尔,,
建筑物:[…新集合(映射的_数组[val])]
};
});
log(映射的_数组)代码>循环是好的,但是这里有一种使用一些内置方法的方法:
const array =[{district:1,buildings:["1","2"]},{district:1,buildings:["1","3"]},{district:2,buildings:["1","2"]}]
var result = {}; //will store our results, object/dict used for optimal indexing
array.map(function(row){ //for each row in the array
//if we have no existing record of it, we will store that record
if(!result[row.district])result[row.district]=row;
else{
//since we have an existing record we will modify it
//for each building num in the new record
row["buildings"].map(function(buildingNum){
//if the building number doesn't exist in the existing record
if(result[row.district]['buildings'].indexOf(buildingNum)==-1){
result[row.district]['buildings'].push(buildingNum) //add it
}
})
}
})
result=Object.values(result) //convert our result back to an array
循环是好的,但是这里有一种使用一些内置方法的方法:
const array =[{district:1,buildings:["1","2"]},{district:1,buildings:["1","3"]},{district:2,buildings:["1","2"]}]
var result = {}; //will store our results, object/dict used for optimal indexing
array.map(function(row){ //for each row in the array
//if we have no existing record of it, we will store that record
if(!result[row.district])result[row.district]=row;
else{
//since we have an existing record we will modify it
//for each building num in the new record
row["buildings"].map(function(buildingNum){
//if the building number doesn't exist in the existing record
if(result[row.district]['buildings'].indexOf(buildingNum)==-1){
result[row.district]['buildings'].push(buildingNum) //add it
}
})
}
})
result=Object.values(result) //convert our result back to an array
这是一个解决方案,它:
- 不会覆盖/更改原始阵列
- 功能齐全
说明:
使用array.reduce(..)
将列表减少为两个唯一的条目(1区和2区),每个条目都有(可能)非唯一的建筑物列表
使用Object.entries(..).map(..)
可以迭代区域,以使建筑物属性唯一
const数组=[
{地区:1,建筑物:['1','2']},
{地区:1,建筑物:['1','3']},
{地区:2,建筑物:['1','2']}
];
const result=Object.entries(
array.reduce(
(行政协调会,{地区,建筑})=>{
acc[地区]=acc[地区]?acc[地区]:[];
acc[地区]。推送(…建筑物);
返回acc;
},
[]
)
).map(m=>({地区:parseInt(m[0]),建筑:[……新设置(m[1])])]));
控制台日志(结果)代码>这是一个解决方案,它:
- 不会覆盖/更改原始阵列
- 功能齐全
说明:
使用array.reduce(..)
将列表减少为两个唯一的条目(1区和2区),每个条目都有(可能)非唯一的建筑物列表
使用Object.entries(..).map(..)
可以迭代区域,以使建筑物属性唯一
const数组=[
{地区:1,建筑物:['1','2']},
{地区:1,建筑物:['1','3']},
{地区:2,建筑物:['1','2']}
];
const result=Object.entries(
array.reduce(
(行政协调会,{地区,建筑})=>{
acc[地区]=acc[地区]?acc[地区]:[];
acc[地区]。推送(…建筑物);
返回acc;
},
[]
)
).map(m=>({地区:parseInt(m[0]),建筑:[……新设置(m[1])])]));
控制台日志(结果)代码>好的!但我仍然在寻找更简单的方法。无论如何,谢谢你!好的!但我仍然在寻找更简单的方法。无论如何,谢谢你!