Объединить массив объекта на основе общего поля

У меня есть объект, который выглядит следующим образом:

[
    {
        "Net_Amount": 499,
        "Date": "2022-01-09T18:30:00.000Z",
        "Scheme_Name": "CUSTOMERWINBACKJCA01",
        "Month": "Jan"
    },
    {
        "Net_Amount": 902,
        "Date": "2022-01-09T18:30:00.000Z",
        "Scheme_Name": "CUSTOMERWINBACKJCA02",
        "Month": "Jan"
    },
    {
        "Net_Amount": 1860,
        "Date": "2022-10-01T18:30:00.000Z",
        "Scheme_Name": "CUSTOMERCONNECTJCA",
        "Month": "Oct"
    },
    {
        "Net_Amount": 1889,
        "Date": "2022-11-01T18:30:00.000Z",
        "Scheme_Name": "CUSTOMERCONNECTJCA",
        "Month": "Nov"
    }
]

Теперь, если вы посмотрите внимательно, у меня есть общее поле Месяц в объектах, и я хочу объединить объекты только на основе этого общего поля. Как я хочу, чтобы мой объект был отформатирован, так:

[
    {
        "Month": "Jan",
        "varData":  [{
            "Net_Amount": 499,
            "Date": "2022-01-09T18:30:00.000Z",
            "Scheme_Name": "CUSTOMERWINBACKJCA01"
        },
        {
            "Net_Amount": 902,
            "Date": "2022-01-09T18:30:00.000Z",
            "Scheme_Name": "CUSTOMERWINBACKJCA02"
        }]
    },
    {
        "Month": "Oct",
        "varData":  [{
            "Net_Amount": 1860,
            "Date": "2022-10-01T18:30:00.000Z",
            "Scheme_Name": "CUSTOMERCONNECTJCA"
        }]
    },
    {
        "Month": "Nov",
        "varData":  [{
            "Net_Amount": 1889,
            "Date": "2022-11-01T18:30:00.000Z",
            "Scheme_Name": "CUSTOMERCONNECTJCA"
        }]
    }
]

Я могу сделать это, перебирая массив и проверяя, совпадает ли месяц, а затем нажимая другой ключ и его значение объекта в varData, но я хочу знать, есть ли какой-либо ярлык или встроенная функция, которую я могу использовать для достижения своей цели .

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я не думаю, что есть лучшее встроенное решение, чем итерация массива.

Но если вы используете названия месяцев в качестве ключей, то код может быть довольно простым (вывод не совсем такой же, но очень похожая структура).

const result = {}
for (const entry of list) {
  if (!result[entry.Month]) {
     result[entry.Month] = []
  }
  result[entry.Month].push(entry)
}

Смотрите jsfiddle.

Если вам нужен вывод, который точно указан в вопросе, вы можете использовать следующий код:

let result = {}
for (const entry of list) {
  const month = entry.Month
  if (!result[month]) {
     result[month] = {
      "Month":   month,
      "varData": []
     }
  }
  delete entry.Month
  result[month].varData.push(entry)
}
result = Object.values(result)

Смотрите jsfiddle

Выходной результат не соответствует требуемому.

Anil kumar 13.02.2023 15:17

@Anilkumar Я добавил вторую версию с точным выводом.

zavg 13.02.2023 15:38

const data = [{"Net_Amount":499,"Date":"2022-01-09T18:30:00.000Z","Scheme_Name":"CUSTOMERWINBACKJCA01","Month":"Jan"},{"Net_Amount":902,"Date":"2022-01-09T18:30:00.000Z","Scheme_Name":"CUSTOMERWINBACKJCA02","Month":"Jan"},{"Net_Amount":1860,"Date":"2022-10-01T18:30:00.000Z","Scheme_Name":"CUSTOMERCONNECTJCA","Month":"Oct"},{"Net_Amount":1889,"Date":"2022-11-01T18:30:00.000Z","Scheme_Name":"CUSTOMERCONNECTJCA","Month":"Nov"}]

console.info([...new Set(data.map(i=>i.Month))].map(Month=>
  ({Month, varData: data.filter(({Month:m})=>m===Month).map(({Month,...o})=>o)})))

const dataArr = [
    {
        Net_Amount: 499,
        Date: "2022-01-09T18:30:00.000Z",
        Scheme_Name: "CUSTOMERWINBACKJCA01",
        Month: "Jan",
    },
    {
        Net_Amount: 902,
        Date: "2022-01-09T18:30:00.000Z",
        Scheme_Name: "CUSTOMERWINBACKJCA02",
        Month: "Jan",
    },
    {
        Net_Amount: 1860,
        Date: "2022-10-01T18:30:00.000Z",
        Scheme_Name: "CUSTOMERCONNECTJCA",
        Month: "Oct",
    },
    {
        Net_Amount: 1889,
        Date: "2022-11-01T18:30:00.000Z",
        Scheme_Name: "CUSTOMERCONNECTJCA",
        Month: "Nov",
    },
];

const outputObj = dataArr.reduce((acc, crt) => {
    acc[crt.Month] ??= [];
    acc[crt.Month].push(crt);
    return acc;
}, {});


const outputArr = Object.values(outputObj).map((item) => ({ Month: item[0].Month, varData: item }));

console.info(outputArr);

Другие вопросы по теме