Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.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_Reduce_Arrayofarrays - Fatal编程技术网

Javascript 基于嵌套数组重新组合对象数组

Javascript 基于嵌套数组重新组合对象数组,javascript,arrays,reduce,arrayofarrays,Javascript,Arrays,Reduce,Arrayofarrays,我有一个对象数组。每个对象包含另一个内部数组。我希望将每个内部数组作为外部对象,并将剩余的旧外部元素作为新创建的外部对象的子属性 输入 data = [ { name: "Sam", ssn: 123, age: 25, hobbies: [{ name: "cricket" }, { name: "football" }] }, { name: "John", ssn: 234, age

我有一个对象数组。每个对象包含另一个内部数组。我希望将每个内部数组作为外部对象,并将剩余的旧外部元素作为新创建的外部对象的子属性

输入

data = [
    {
      name: "Sam",
      ssn: 123,
      age: 25,
      hobbies: [{ name: "cricket" }, { name: "football" }]
    },
    {
      name: "John",
      ssn: 234,
      age: 25,
      hobbies: [{ name: "cricket" }, { name: "football" }]
    },
    {
      name: "Mathew",
      ssn: 345,
      age: 25,
      hobbies: [{ name: "cricket" }, { name: "football" }, {name: "carroms"}]
    }
  ];
[
      {
        name: "cricket",
        person_details: [
          { name: "Sam", ssn: 123, age: 25 },
          { name: "John", ssn: 234, age: 25 },
          { name: "Mathew", ssn: 345, age: 25 }
        ]
      },
      {
        name: "football",
        person_details: [
          { name: "Sam", ssn: 123, age: 25 },
          { name: "John", ssn: 234, age: 25 },
          { name: "Mathew", ssn: 345, age: 25 }
        ]
      },
      {
        name: "carroms",
        person_details: [          
          { name: "Mathew", ssn: 345, age: 25 }
        ]
      }
    ]
预期产出

data = [
    {
      name: "Sam",
      ssn: 123,
      age: 25,
      hobbies: [{ name: "cricket" }, { name: "football" }]
    },
    {
      name: "John",
      ssn: 234,
      age: 25,
      hobbies: [{ name: "cricket" }, { name: "football" }]
    },
    {
      name: "Mathew",
      ssn: 345,
      age: 25,
      hobbies: [{ name: "cricket" }, { name: "football" }, {name: "carroms"}]
    }
  ];
[
      {
        name: "cricket",
        person_details: [
          { name: "Sam", ssn: 123, age: 25 },
          { name: "John", ssn: 234, age: 25 },
          { name: "Mathew", ssn: 345, age: 25 }
        ]
      },
      {
        name: "football",
        person_details: [
          { name: "Sam", ssn: 123, age: 25 },
          { name: "John", ssn: 234, age: 25 },
          { name: "Mathew", ssn: 345, age: 25 }
        ]
      },
      {
        name: "carroms",
        person_details: [          
          { name: "Mathew", ssn: 345, age: 25 }
        ]
      }
    ]
我使用Reduce的尝试如下

this.data = this.data.reduce(
  (a, x) => [...x.hobbies.map(h => ({ ...x, hobbies: [h] }))],
  []
);

创建一个索引为爱好的对象。迭代人员时,使用
名称
人员详细信息
数组创建一个新对象(如果该对象尚不存在),然后推送到
人员详细信息
数组:

const数据=[
{
姓名:“山姆”,
ssn:123,
年龄:25岁,
爱好:[{名字:“板球”},{名字:“足球”}]
},
{
姓名:“约翰”,
ssn:234,
年龄:25岁,
爱好:[{名字:“板球”},{名字:“足球”}]
},
{
姓名:“马修”,
ssn:345,
年龄:25岁,
爱好:[{name:“板球”},{name:“足球”},{name:“carroms”}]
}
];
const peoplebycabiods={};
用于(数据的常数{爱好,…个人数据}){
用于(兴趣爱好的常数{name}){
如果(!PeopleBy嗜好[name])PeopleBy嗜好[name]={name,person_详细信息:[]};
PeopleBy嗜好[name]。个人详细信息。推送({…personData});
}
}
常量输出=对象值(PeopleBy嗜好);

控制台日志(输出)创建一个为爱好编制索引的对象。迭代人员时,使用
名称
人员详细信息
数组创建一个新对象(如果该对象尚不存在),然后推送到
人员详细信息
数组:

const数据=[
{
姓名:“山姆”,
ssn:123,
年龄:25岁,
爱好:[{名字:“板球”},{名字:“足球”}]
},
{
姓名:“约翰”,
ssn:234,
年龄:25岁,
爱好:[{名字:“板球”},{名字:“足球”}]
},
{
姓名:“马修”,
ssn:345,
年龄:25岁,
爱好:[{name:“板球”},{name:“足球”},{name:“carroms”}]
}
];
const peoplebycabiods={};
用于(数据的常数{爱好,…个人数据}){
用于(兴趣爱好的常数{name}){
如果(!PeopleBy嗜好[name])PeopleBy嗜好[name]={name,person_详细信息:[]};
PeopleBy嗜好[name]。个人详细信息。推送({…personData});
}
}
常量输出=对象值(PeopleBy嗜好);

控制台日志(输出)您可以减少数组并为结果集查找同名项

var data=[{name:“Sam”,ssn:123,年龄:25,爱好:[{name:“cricket”},{name:“football”},{name:“John”,ssn:234,年龄:25,爱好:[{name:“cricket”},{name:“football”},{name:“Mathew”,ssn:345,年龄:25,爱好:[{name:“cricket name:“football”},{name:“carroms”},},
结果=数据.reduce((r,{爱好,…o})=>{
嗜好。forEach({name})=>{
var group=r.find(q=>q.name==name);
if(!group)r.push(group={name,person_details:[]});
组。个人信息。推送(o);
})
返回r;
}, []);
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
您可以减少数组并为结果集查找同名项

var data=[{name:“Sam”,ssn:123,年龄:25,爱好:[{name:“cricket”},{name:“football”},{name:“John”,ssn:234,年龄:25,爱好:[{name:“cricket”},{name:“football”},{name:“Mathew”,ssn:345,年龄:25,爱好:[{name:“cricket name:“football”},{name:“carroms”},},
结果=数据.reduce((r,{爱好,…o})=>{
嗜好。forEach({name})=>{
var group=r.find(q=>q.name==name);
if(!group)r.push(group={name,person_details:[]});
组。个人信息。推送(o);
})
返回r;
}, []);
控制台日志(结果)
。作为控制台包装器{max height:100%!important;top:0;}
简单的组合可以循环查看
爱好列表
,再加上语法可以轻松完成以下任务:

const data=[{name:“Sam”,ssn:123,年龄:25,爱好:[{name:“cricket”},{name:“football”},{name:“John”,ssn:234,年龄:25,爱好:[{name:“cricket”},{name:“football”},{name:“Mathew”,ssn:345,年龄:25,爱好:[{{name:“cricket name:“football”},{name:“carroms”}],
result=data.reduce((r,{cabiods,…userData})=>(
嗜好。forEach({name})=>(
match=r.find(({hobby}=>hobby==name),
火柴
匹配['person_details']。推送({…userData}):
r、 推送({hobby:name,person_details:[{…userData}]})
))
,r),[])
console.log(结果)
.as控制台包装器{min height:100%;}
简单的团队合作,循环查看
爱好列表
,再加上语法,可以轻松完成以下任务:

const data=[{name:“Sam”,ssn:123,年龄:25,爱好:[{name:“cricket”},{name:“football”},{name:“John”,ssn:234,年龄:25,爱好:[{name:“cricket”},{name:“football”},{name:“Mathew”,ssn:345,年龄:25,爱好:[{{name:“cricket name:“football”},{name:“carroms”}],
result=data.reduce((r,{cabiods,…userData})=>(
嗜好。forEach({name})=>(
match=r.find(({hobby}=>hobby==name),
火柴
匹配['person_details']。推送({…userData}):
r、 推送({hobby:name,person_details:[{…userData}]})
))
,r),[])
console.log(结果)
.as console wrapper{min height:100%;}
使用
Array#reduce
。您可以在每次迭代中使用以下方法传递对象

const arr=[{name:“Sam”,ssn:123,年龄:25,爱好:[{name:“cricket”},{name:“football”},{name:“John”,ssn:234,年龄:25,爱好:[{name:“cricket”},{name:“football”},{name:“Mathew”,ssn:345,年龄:25,爱好:[{name:“cricket name:“football”},{name:“carroms”}];
常数res=arr.reduce((ac