Javascript 将属性对象作为父对象拉入

Javascript 将属性对象作为父对象拉入,javascript,ecmascript-6,lodash,Javascript,Ecmascript 6,Lodash,我有一组我无法控制的数据,它是托管在某个地方的API,我没有访问权限 let x = [ {name: "james", age: 10, school: {id:1, name:"London"}}, {name: "james_2", age: 11, school: {id:1, name:"London"}}, {name: "john", age: 12, school: {id:2, name:"India"}}, {name: "johnny", a

我有一组我无法控制的数据,它是托管在某个地方的API,我没有访问权限

let x = [
    {name: "james", age: 10, school: {id:1, name:"London"}},
    {name: "james_2", age: 11, school: {id:1, name:"London"}},
    {name: "john", age: 12, school: {id:2, name:"India"}},
    {name: "johnny", age: 56, school: {id:3, name:"USA"}}
]
我怎样才能先在学校分组?我需要这样的格式

[{
    id:1,
    name: "London",
    data: [{
        name: "james", age: 10, school: {id:1, name:"London"
    },{name: "james_2", age: 11, school: {id:1, name:"London"}}]
}]

您可以创建一个散列对象,以其id存储每个学校,以便将学生推送到该学校:

var hash=x.reduce(function(obj,el){
 (obj[el.school.id]=obj[el.school.id]||{id:el.school.id,name:el.school.name,data:[]}).data.push({name:el.name,age:el.age});
  return obj;
},{});

var arr=Object.values(hash);
您可以使用以下方法:

让数据=[ {姓名:詹姆斯,年龄:10岁,学校:{id:1,姓名:伦敦}, {姓名:james_2,年龄:11岁,学校:{id:1,姓名:London}, {姓名:约翰,年龄:12岁,学校:{id:2,姓名:印度}, {姓名:约翰尼,年龄:56岁,学校:{id:3,姓名:美国} ]; let schools=data.reduceac,x=>{ //检查学校是否已经存在 让school=acc.findy=>y.id==x.school.id; 如果!学校{ //如果不是,则当前学校就是当前人员的学校 学校=x.学校; school.data=[]; 行政协调会学校; }否则{ //防止具有相同id的学校对象重复 x、 学校=学校; } school.data.pushx; 返回acc; }, [];
学校 您可以将lodash库与groupBy一起使用

let x = [
    {name: "james", age: 10, school: {id:1, name:"London"}},
    {name: "james_2", age: 11, school: {id:1, name:"London"}},
    {name: "john", age: 12, school: {id:2, name:"India"}},
    {name: "johnny", age: 56, school: {id:3, name:"USA"}}
]


var result2 = _.chain(x)
    .groupBy(function(o){return o.school.name})
    .pairs()
    .map(function (currentItem) {
        return _.object(_.zip(["school", "name"], currentItem));
    })
    .value();
console.log(result2);
检查此JSFIDLE:-

您可以使用并将结果映射回数组:

const data=[{姓名:詹姆斯,年龄:10岁,学校:{id:1,姓名:伦敦}},{姓名:詹姆斯2,年龄:11岁,学校:{id:1,姓名:伦敦},{姓名:约翰,年龄:12岁,学校:{id:2,姓名:印度},{姓名:约翰尼,年龄:56岁,学校:{id:3,姓名:美国}]; 常量结果=_数据 .groupBy'school.name' .mapgroup=>{//或Object.assign{},组[0]。学校,{数据:组}; …组[0]。学校, 资料:小组 } 价值 console.logresult; 设x=[ {姓名:詹姆斯,年龄:10岁,学校:{id:1,姓名:伦敦}, {姓名:james_2,年龄:11岁,学校:{id:1,姓名:London}, {姓名:约翰,年龄:12岁,学校:{id:2,姓名:印度}, {姓名:约翰尼,年龄:56岁,学校:{id:3,姓名:美国} ]; 让结果=[]; forvar i=0;is.id===person.school.id; 如果!学校{ 学校={ id:person.school.id, 姓名:person.school.name, 数据:[] }; 结果:学校; } school.data.pushperson; }
console.logresult 使用reduce,如果id不存在,只需将新对象推送到结果数组中,否则只需更新找到的对象中的数据数组

const myArray = x.reduce((res, data) => {
  const found = res.find(o => o.id === data.school.id);

  if (!found) {
    res.push({
        id: data.school.id,
        name: data.school.name,
        data: [data]
    });
  } else {
    found.data.push(data);
  }
  return res;
}, []);


console.log(myArray)

对?这是为了什么?@AlanJenshen\u pairs:-为对象创建一个二维键值对数组,例如[key1,value1],[key2,value2].\u。配对{'barney':36,'fred':40};//=>迭代顺序无法保证这是什么_数据组[0]。为什么在此处使用[0?\u数据启动一个lodash链。组[0]。学校用于从组的第一个元素中获取学校名称和id。组[0]如何获取学校名称和id。学校是第一个元素?我不明白欢迎:顺便说一句,object rest/spread需要一个babel插件,所以如果它在您这边不起作用,请使用Objectassign:object.assing{}、{item.school}、{data:[]}。