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])])]));
    
    控制台日志(结果)好的!但我仍然在寻找更简单的方法。无论如何,谢谢你!好的!但我仍然在寻找更简单的方法。无论如何,谢谢你!