Как объединить значения двух объектов в JavaScript - PullRequest
0 голосов
/ 26 февраля 2020

В приведенном ниже объекте возможно ли объединить значения на основе StudentID?

{
  "moduleResults": [
    { 
      "StudentID": "00001480", 
       "ModuleCode": "MED3007-N", 
       "AcYear": "2018/9", 
       "Mark": "80", 
       "Grade": "A" 
     }, 
     { 
       "StudentID": "00001480", 
       "ModuleCode": "MED3020-N", 
       "AcYear": "2018/9", 
       "Mark": "82", 
       "Grade": "A" 
    }
  ]
}

Мой желаемый результат:

{ 
  "StudentID": "00001480", 
  "ModuleCode": ["MED3007-N","MED3020-N"], 
  "AcYear": "2018/9", 
  "Mark":["80","82"], 
  "Grade": ["A","A"] 
}

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Другой вариант, который у вас есть, это использовать .map() и .find(). Внутри вашей карты вы можете использовать функцию поиска для поиска дубликатов и добавления в новый массив.

const data = {
  "moduleResults": [
    {
      "StudentID": "00001480",
      "ModuleCode": "MED3007-N",
      "AcYear": "2018/9",
      "Mark": "80",
      "Grade": "A"
    },
    {
      "StudentID": "00001480",
      "ModuleCode": "MED3020-N",
      "AcYear": "2018/9",
      "Mark": "82",
      "Grade": "A"
    }
  ]
};

const newData = [];

data.moduleResults.map((o) => {
  const dups = newData.find((nd) => {
    return nd.StudentID === o.StudentID;
  });
  
  if (!dups) {
    newData.push({
      "StudentID": o.StudentID,
      "ModuleCode": [o.ModuleCode],
      "AcYear": o.AcYear,
      "Mark": [o.Mark],
      "Grade": [o.Grade]
    })
  } else {
     dups.Mark.push(o.Mark);
     dups.Grade.push(o.Grade);
     dups.ModuleCode.push(o.ModuleCode);
  }
  
  return newData;
});

console.log(newData);
0 голосов
/ 26 февраля 2020
const records = {
  "moduleResults": [
    {
      "StudentID": "00001480",
      "ModuleCode": "MED3007-N",
      "AcYear": "2018/9",
      "Mark": "80",
      "Grade": "A"
    },
    {
      "StudentID": "00001480",
      "ModuleCode": "MED3020-N",
      "AcYear": "2018/9",
      "Mark": "82",
      "Grade": "A"
    }
  ]
};

const mergedRecords = 
    Array.from(
        records.moduleResults
            .reduce(
                (acc, val) => {
                    if(!acc.has(val.StudentID)) {
                        acc.set(
                            val.StudentID,
                            {
                                ...val,
                                ModuleCode: [val.ModuleCode],
                                Mark: [val.Mark],
                                Grade: [val.Grade]
                            }
                        )
                    } else {
                        const record = acc.get(val.StudentID);
                        acc.set(val.StudentID, {
                            ...record,
                            ModuleCode: [...record.ModuleCode, val.ModuleCode],
                            Mark: [...record.Mark, val.Mark],
                            Grade: [...record.Grade, val.Grade]
                        });
                    }
                    return acc;
                },
                new Map()
        ).values()    
    );
...