如何根据对象属性对对象数组进行分组?

时间:2020-11-02 05:05:51

标签: javascript angular typescript

我有一个如下数组:

let data:[
    {
        "class": "X",
        "student":[
            {
                "name": "Bumblebee",
                "id":"SAB77"
            }
        ]
    },
    {
        "class": "X",
        "student":[
            {
                "name": "Omega",
                "id":"SAB78"
            }
        ]
    },
    {
        "class": "IX",
        "student":[
            {
                "name": "Pluto",
                "id":"RBC17"
            }
        ]
    },
    {
        "class": "IX",
        "student":[
            {
                "name":"16 psyche",
                "id":"RBC18"
            }
        ]
    }
]

我要分组如下:


 data:[
    {
        "class": "X",
        "student":[
            {
                "name": "Bumblebee",
                "id":"SAB77"
            },
            {
                "name": "Omega",
                "id":"SAB78"
            }
        ]
    },
    {
        "class": "IX",
        "student":[
            {
                "name": "Pluto",
                "id":"RBC17"
            },
            {
                "name": "16 psyche",
                "id":"RBC18"
            }
        ]
    }
]

3 个答案:

答案 0 :(得分:0)

let data = [{
    "class": "X",
    "student": [{
      "name": "Bumblebee",
      "id": "SAB77"
    }]
  },
  {
    "class": "X",
    "student": [{
      "name": "Omega",
      "id": "SAB78"
    }]
  },
  {
    "class": "IX",
    "student": [{
      "name": "Pluto",
      "id": "RBC17"
    }]
  },
  {
    "class": "IX",
    "student": [{
      "name": "16 psyche",
      "id": "RBC18"
    }]
  }
];

const result = data.reduce((acc, obj) => {
  let existedObj = acc.length && acc.find(ele => ele.class === obj.class);
  if (!acc.length || !existedObj) {
    acc.push(obj);
    return acc;
  }
  existedObj.student = [...existedObj.student, ...obj.student];
  return acc;
}, []);

console.log(result);

答案 1 :(得分:0)

let data = [
    {
        "class": "X",
        "student":[
            {
                "name": "Bumblebee",
                "id":"SAB77"
            }
        ]
    },
    {
        "class": "X",
        "student":[
            {
                "name": "Omega",
                "id":"SAB78"
            }
        ]
    },
    {
        "class": "IX",
        "student":[
            {
                "name": "Pluto",
                "id":"RBC17"
            }
        ]
    },
    {
        "class": "IX",
        "student":[
            {
                "name":"16 psyche",
                "id":"RBC18"
            }
        ]
    }
];



const output = data.reduce((acc, rec) => {
 const obj = acc.find(ele => ele.class === rec.class);
    if (obj) {
      obj.student = [...obj.student, ...rec.student]; 
    } else {
      acc.push(rec);
    }
  return acc;
}, []);

console.log(output)

答案 2 :(得分:0)

尝试一下。

let data = [
    {
        "class": "X",
        "student": [
            {
                "name": "Bumblebee",
                "id": "SAB77"
            }
        ]
    },
    {
        "class": "X",
        "student": [
            {
                "name": "Omega",
                "id": "SAB78"
            }
        ]
    },
    {
        "class": "IX",
        "student": [
            {
                "name": "Pluto",
                "id": "RBC17"
            }
        ]
    },
    {
        "class": "IX",
        "student": [
            {
                "name": "16 psyche",
                "id": "RBC18"
            }
        ]
    }
]
var reOrganized = [];
var unseen_classes = [];

for (var i = 0; i < data.length; i++) {
    if (unseen_classes.indexOf(data[i].class) !== -1) {
        for (var j = 0; j < reOrganized.length; j++) {
            if (reOrganized[j].class === data[i].class) {
                reOrganized[j].students.push(data[i].student[0])
            }
        }
    }
    else {
        unseen_classes.push(data[i].class)
        reOrganized.push({
            class: data[i].class,
            students: [data[i].student[0]]
        })
    }
}
console.log(reOrganized)