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

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

[
    {
        "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, но я хочу знать, есть ли какой-либо ярлык или встроенная функция, которую я могу использовать для достижения своей цели .

Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
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);

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