如果某个键使用JavaScript相同,则从另一个数组构建数组

如果某个键使用JavaScript相同,则从另一个数组构建数组,javascript,Javascript,我有一组数据。数组中的某些键是相同的。我想基于键创建一个新数组,并添加其他数据 这是我的阵列 var myObjOne = [ { "name":"John", "id":1, "car":"maruti" }, { "name":"John", "id":2, "car":"wolks" }, { "name"

我有一组数据。数组中的某些键是相同的。我想基于键创建一个新数组,并添加其他数据

这是我的阵列

 var myObjOne = [
        {
        "name":"John",
        "id":1,
        "car":"maruti"
       },
       {
        "name":"John",
        "id":2,
        "car":"wolks"
       },
       {
        "name":"John",
        "id":3,
        "car":"bmw"
       },        
      {
        "name":"Peter",       
        "id":4, 
        "car":"alto"                           
      },
      {
        "name":"Peter",       
        "id":5, 
        "car":"swift"                           
      }
    ];
我想将数组转换为以下格式

var myObj = [
          {
          "name":"John",
          "items": [
              { "id":1, "car":"maruti" },  
              { "id":2, "car":"wolks" },
              { "id":3, "car":"bmw" }            
          ]},
          {
            "name":"Peter",
          "items": [
              { "id":4, "car":"alto" },  
              { "id":5, "car":"swift" },                          
          ]
       }
      ];

我正在处理节点环境。

使用
。将
简化为按名称分组,并使用
。在简化程序中查找
,以查找是否已添加匹配的
名称

const input=[{“name”:“John”,“id”:1,“car”:“maruti”},{“name”:“John”,“id”:2,“car”:“wolks”},{“name”:“John”,“id”:3,“car”:“bmw”},{“name”:“Peter”,“id”:4,“cars”:“alto”},{“name”:“Peter”,“id”:5,“cars”:“swift”}]
const output=input.reduce((a,{name,…item})=>{
const foundNameObj=a.find(nameObj=>nameObj.name==name);
if(foundNameObj)foundNameObj.items.push(item);
else a.push({name,items:[item]});
返回a;
}, []);

控制台日志(输出)您可以先使用映射名称和项目的对象创建对象,然后使用循环在中间映射上循环创建最终数组:

var source=[{“name”:“John”,“id”:1,“car”:“maruti”},{“name”:“John”,“id”:2,“car”:“wolks”},{“name”:“John”,“id”:3,“car”:“bmw”},{“name”:“Peter”,“id”:4,“cars”:“alto”},{“name”:“Peter”,“id”:5,“cars”:“swift”};
const map=source.reduce((acc,{name,{obj})=>{
如果(!acc[名称]){
acc[名称]=[];
}
acc[名称].推送(obj);
返回acc;
}, {});
常量结果=[];
for(让Object.entries的[名称,项](map)){
push({name,items});
}

控制台日志(结果)
Array.reduce处于救援状态。此方法接受
累加器
当前
项目。检查累加器中是否存在name属性值为John或Peter的对象

var myObjOne=[{
“姓名”:“约翰”,
“id”:1,
“汽车”:“马鲁蒂”
},
{
“姓名”:“约翰”,
“id”:2,
“汽车”:“沃尔克斯”
},
{
“姓名”:“约翰”,
“id”:3,
“汽车”:“宝马”
},
{
“姓名”:“彼得”,
“id”:4,
“汽车”:“中音”
},
{
“姓名”:“彼得”,
“id”:5,
“汽车”:“斯威夫特”
}
];
var newObj=myObjOne.reduce(函数(acc、curr、currendex){
//使用findIndex检查是否存在对象
//其中name属性的值为John,Peter
//如果它存在,它将返回索引,否则它将返回-1
让ifNameExist=acc.findIndex(函数(项){
return item.name==curr.name;
})
//如果为-1,则创建一个具有name和item属性的对象,并按
//将其连接到蓄能器
如果(ifNameExist===-1){
设nameObj={};
nameObj.name=curr.name;
nameObj.items=[];
nameObj.items.push({
id:curr.id,
汽车:现车
})
附件推送(名称OBJ)
}否则{
//如果这样的对象已经存在,那么只需更新项目数组
acc[ifNameExist].items.push({
id:curr.id,
汽车:现车
})
}
返回acc;
}, []);

console.log(newObj)
请向我们展示您已经尝试过的功能。我们将很乐意帮助您解决您的解决方案中的问题,但这不是免费的编码服务。