javascript 对数组中匹配相同键的所有项目求和
javascript Sum all item in array which match same key
我有一个 JSON 这样的:
[
{
"faculty":{
"_id":"5f9c3e04e5a5423cec34b2e2",
"code":"khmt",
"facultyName":"Computer Science"
},
"classSize":91,
"warnedLength":61
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"dtvt",
"facultyName":"Electronics and Telecommunication"
},
"classSize":89,
"warnedLength":44
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"dtvt",
"facultyName":"Electronics and Telecommunication"
},
"classSize":59,
"warnedLength":20
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"hkvt",
"facultyName":"Space Airline"
},
"classSize":10,
"warnedLength":5
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"hkvt",
"facultyName":"Space Airline"
},
"classSize":20,
"warnedLength":10
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"hkvt",
"facultyName":"Space Airline"
},
"classSize":30,
"warnedLength":15
}
]
我想要这样的输出:
[
{
"faculty":{
"_id":"5f9c3e04e5a5423cec34b2e2",
"code":"khmt",
"facultyName":"Computer Science"
},
"totalClassSize":91,
"totalWarnedLength":61
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"dtvt",
"facultyName":"Electronics and Telecommunication"
},
"totalClassSize":148, // total classSize of all class has facultyName is "Electronics and Telecommunication"
"totalWarnedLength":64 // total warnedLength of all class has facultyName is "Electronics and Telecommunication"
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6de0",
"code":"hkvt",
"facultyName":"Space Airline"
},
"totalClassSize":60, // total classSize of all class has facultyName is "Space Airline"
"totalWarnedLength":30 // total warnedLength of all class has facultyName is "Space Airline"
},
]
输出是一个数组,它将所有 classSize
具有相同教员的人求和为 属性 totalClassSize
并将所有 warnedLength
具有相同教员的人求和为 属性 totalWarnedLength
输入是数组,输出也是数组
我是一个学习代码的初学者,我仍然被这个问题困扰了一段时间
非常感谢你帮助我,祝你有美好的一天
使用Array.prototype.reduce
,您可以通过将当前输入数组按faculty._id
分组作为对象键来生成新对象,并在此基础上计算totalWarnedLength
和totalClassSize
对于相同的对象键。
const input = [{
"faculty": {
"_id": "5f9c3e04e5a5423cec34b2e2",
"code": "khmt",
"facultyName": "Computer Science"
},
"classSize": 91,
"warnedLength": 61
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "dtvt",
"facultyName": "Electronics and Telecommunication"
},
"classSize": 89,
"warnedLength": 44
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "dtvt",
"facultyName": "Electronics and Telecommunication"
},
"classSize": 59,
"warnedLength": 20
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "hkvt",
"facultyName": "Space Airline"
},
"classSize": 10,
"warnedLength": 5
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "hkvt",
"facultyName": "Space Airline"
},
"classSize": 20,
"warnedLength": 10
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "hkvt",
"facultyName": "Space Airline"
},
"classSize": 30,
"warnedLength": 15
}
];
const groupBy = input.reduce((acc, cur) => {
if (acc[cur.faculty['_id']]) {
acc[cur.faculty['_id']].totalClassSize += cur.classSize;
acc[cur.faculty['_id']].totalWarnedLength += cur.warnedLength;
} else {
acc[cur.faculty['_id']] = {
faculty: cur.faculty,
totalClassSize: cur.classSize,
totalWarnedLength: cur.warnedLength
};
}
return acc;
}, {});
const output = Object.values(groupBy);
console.log(output);
我有一个 JSON 这样的:
[
{
"faculty":{
"_id":"5f9c3e04e5a5423cec34b2e2",
"code":"khmt",
"facultyName":"Computer Science"
},
"classSize":91,
"warnedLength":61
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"dtvt",
"facultyName":"Electronics and Telecommunication"
},
"classSize":89,
"warnedLength":44
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"dtvt",
"facultyName":"Electronics and Telecommunication"
},
"classSize":59,
"warnedLength":20
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"hkvt",
"facultyName":"Space Airline"
},
"classSize":10,
"warnedLength":5
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"hkvt",
"facultyName":"Space Airline"
},
"classSize":20,
"warnedLength":10
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"hkvt",
"facultyName":"Space Airline"
},
"classSize":30,
"warnedLength":15
}
]
我想要这样的输出:
[
{
"faculty":{
"_id":"5f9c3e04e5a5423cec34b2e2",
"code":"khmt",
"facultyName":"Computer Science"
},
"totalClassSize":91,
"totalWarnedLength":61
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6f71",
"code":"dtvt",
"facultyName":"Electronics and Telecommunication"
},
"totalClassSize":148, // total classSize of all class has facultyName is "Electronics and Telecommunication"
"totalWarnedLength":64 // total warnedLength of all class has facultyName is "Electronics and Telecommunication"
},
{
"faculty":{
"_id":"5f9c53c8a0db8f4240ec6de0",
"code":"hkvt",
"facultyName":"Space Airline"
},
"totalClassSize":60, // total classSize of all class has facultyName is "Space Airline"
"totalWarnedLength":30 // total warnedLength of all class has facultyName is "Space Airline"
},
]
输出是一个数组,它将所有 classSize
具有相同教员的人求和为 属性 totalClassSize
并将所有 warnedLength
具有相同教员的人求和为 属性 totalWarnedLength
输入是数组,输出也是数组
我是一个学习代码的初学者,我仍然被这个问题困扰了一段时间
非常感谢你帮助我,祝你有美好的一天
使用Array.prototype.reduce
,您可以通过将当前输入数组按faculty._id
分组作为对象键来生成新对象,并在此基础上计算totalWarnedLength
和totalClassSize
对于相同的对象键。
const input = [{
"faculty": {
"_id": "5f9c3e04e5a5423cec34b2e2",
"code": "khmt",
"facultyName": "Computer Science"
},
"classSize": 91,
"warnedLength": 61
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "dtvt",
"facultyName": "Electronics and Telecommunication"
},
"classSize": 89,
"warnedLength": 44
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "dtvt",
"facultyName": "Electronics and Telecommunication"
},
"classSize": 59,
"warnedLength": 20
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "hkvt",
"facultyName": "Space Airline"
},
"classSize": 10,
"warnedLength": 5
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "hkvt",
"facultyName": "Space Airline"
},
"classSize": 20,
"warnedLength": 10
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "hkvt",
"facultyName": "Space Airline"
},
"classSize": 30,
"warnedLength": 15
}
];
const groupBy = input.reduce((acc, cur) => {
if (acc[cur.faculty['_id']]) {
acc[cur.faculty['_id']].totalClassSize += cur.classSize;
acc[cur.faculty['_id']].totalWarnedLength += cur.warnedLength;
} else {
acc[cur.faculty['_id']] = {
faculty: cur.faculty,
totalClassSize: cur.classSize,
totalWarnedLength: cur.warnedLength
};
}
return acc;
}, {});
const output = Object.values(groupBy);
console.log(output);