Javascript json object reduction by multiple keys?

Viewed 41

working on an app I'm an intern, I need to join these JSON objects by name, weight, and all grades. I did it for name and weight and now we need to add grades, absolutely baffled no idea what to even google...

This is the function, code from var holder = {} down is the old algorithm, need a new one to join on multiple keys.

async function grade() {
  try {
    const data = await model.run_stock.findAll({
      offset: 0,
      limit: 200,
      include: [
        {
          model: model.truerun,
          attributes: { exclude: ["updatedAt", "batchId", "gradeListId"] },
          include: [
            {

              model: model.batch,
              attributes: [
                "id",
                "name",
                "age",
                "quantity",
                "source",
                "hatchery",
              ],
              include: [
                {
                  model: model.shellfish,
                  attributes: ["id", "name", "type", "species"],
                },
              ],


            },
            {
              model: model.grade_list,
              attributes: ["id", "name", "alias"],
            },
          ],
        },
      ],
    });

    let a = [];

    for (let i = 0; i <= data.length; i++) {
      if (!data[i]) {
        continue;
      }

      const { avgTotalWeight } = data[i];
      const { name } = data[i].truerun.batch.shellfish;
      const { alias } = data[i].truerun.grade_list;

      if (avgTotalWeight !== null) {

        let grade1, grade2, grade3 = 0;

        if (alias === "G1") {
          grade1 = avgTotalWeight;
        } else grade1 = 0;

        if (alias === "G2") {
          grade2 = avgTotalWeight;
        } else grade2 = 0;

        if (alias === "G3") {
          grade3 = avgTotalWeight;
        } else grade3 = 0;

        let b = {
          avgTotalWeight: avgTotalWeight,
          name: name,
          grade: {
            grade1: grade1,
            grade2: grade2,
            grade3: grade3
          }
        };
        a.push(b);
      }
    }

    var holder = {};

    a.forEach(function (d) {
      if (holder.hasOwnProperty(d.name)) {
        holder[d.name] = holder[d.name] + d.avgTotalWeight;
      } else {
        holder[d.name] = d.avgTotalWeight;
      }
    });

    var obj2 = [];

    for (var prop in holder) {
      obj2.push({ name: prop, weight: holder[prop] });
    }

    return a;
  } catch (err) {
    throw err;
  }
}

This is the postman request data.

{
    "data": [
        {
            "avgTotalWeight": 16,
            "name": "france Naicin",
            "grade": {
                "grade1": 16,
                "grade2": 0,
                "grade3": 0
            }
        },
        {
            "avgTotalWeight": 16,
            "name": "pacific gigas",
            "grade": {
                "grade1": 16,
                "grade2": 0,
                "grade3": 0
            }
        },
        {
            "avgTotalWeight": 13,
            "name": "france Naicin",
            "grade": {
                "grade1": 13,
                "grade2": 0,
                "grade3": 0
            }
        },
        {
            "avgTotalWeight": 14,
            "name": "france Naicin",
            "grade": {
                "grade1": 14,
                "grade2": 0,
                "grade3": 0
            }
        },
        {
            "avgTotalWeight": 15,
            "name": "france Naicin",
            "grade": {
                "grade1": 15,
                "grade2": 0,
                "grade3": 0
            }
        },
        {
            "avgTotalWeight": 16,
            "name": "france Naicin",
            "grade": {
                "grade1": 16,
                "grade2": 0,
                "grade3": 0
            }
        },
        {
            "avgTotalWeight": 13,
            "name": "france Naicin",
            "grade": {
                "grade1": 13,
                "grade2": 0,
                "grade3": 0
            }
        },
        {
            "avgTotalWeight": 12,
            "name": "france Naicin",
            "grade": {
                "grade1": 12,
                "grade2": 0,
                "grade3": 0
            }
        },
        {
            "avgTotalWeight": 11,
            "name": "france Naicin",
            "grade": {
                "grade1": 0,
                "grade2": 11,
                "grade3": 0
            }
        },
        {
            "avgTotalWeight": 10,
            "name": "france Naicin",
            "grade": {
                "grade1": 10,
                "grade2": 0,
                "grade3": 0
            }
        },
        {
            "avgTotalWeight": 9,
            "name": "france Naicin",
            "grade": {
                "grade1": 0,
                "grade2": 0,
                "grade3": 9
            }
        }
    ]
}

It is supposed to look like this in the end:

{
   "name": "FranceNiance",
   "total": 80,
   "grades": {
     "grade1": "30",
     "grade2": "30",
     "grade3": "20"
}, ....
0 Answers
Related