Как повторно сгруппировать массив объектов по одному из свойств объекта

Я видел аналогичный вопрос в stackoverflow, используя метод сокращения, подобный этому сообщению: Javascript — группировка по одному свойству объекта в массиве объектов.

но я хотел бы получить результат в виде массива [], а не объекта {}.

Вот пример

Вход:

[
  {
    "name": "ABC Equity",
    "category": "Equity"
  },
  {
    "name": "EBC Bonds",
    "category": "Bond"
  },
  {
    "name": "Corporate Bonds",
    "category": "Bond"
  },
  {
    "name": "Private Equity",
    "category": "Equity"
  },
  {
    "name": "Fixed abc",
    "category": "Fixed"
  }
]

Ожидается после перегруппировки:

[
  {
    label: 'Equity',
    options: [
      { value: 'ABC Equity', label: 'ABC Equity'},
      { value: 'Private Equity', label: 'Private Equity'},
    ],
  },
  {
    label: 'Bond',
    options: [
      { value: 'EBC Bonds', label: 'EBC Bonds'},
      { value: 'Corporate Bonds', label: 'Corporate Bonds' },
    ],
  },
   {
    label: 'Fixed',
    options: [
      { value: 'Fixed abc', label: 'Fixed abc'}
    ],
  },
]
Поведение ключевого слова "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) для оценки ваших знаний,...
0
2
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Чтобы преобразовать объект, созданный с помощью редукции, вам нужно взять значения объекта после редукции.

Обратите внимание на использование нулевого объединяющего присваивания операторов ??=

Этот код O (n) (выполняется один раз над входом)

const arr1 = [ 
  { "name": "ABC Equity",      "category": "Equity" },
  { "name": "EBC Bonds",       "category": "Bond"   },
  { "name": "Corporate Bonds", "category": "Bond"   },
  { "name": "Private Equity",  "category": "Equity" },
  { "name": "Fixed abc",       "category": "Fixed"  }
];

const arr2 = Object.values(
  arr1.reduce((acc,{name,category}) => {
    acc[category] ??= {};
    acc[category].label = category;
    acc[category].options ??= [];
    acc[category].options.push({"value": name, "label": name});
    return acc;
  },{})
);

console.info(arr2);

Спасибо за ваши усилия, когда вы сказали, что JSON - это строковый формат в obj, строковый формат в obj означает что-то вроде этого "{'key1': 'value'}"?

user21357723 20.04.2023 10:20

потому что я все еще не совсем понимаю не относящуюся к делу часть?

user21357723 20.04.2023 10:22

Нет. JSON — это строковое представление объектов JavaScript. Это то, что вы получаете, когда делаете JSON.stringify(obj), где obj может быть объектом {} или массивом (который также является объектом) []

mplungjan 20.04.2023 10:22

Пожалуйста, взгляните на javascript-object-vs-json

mplungjan 20.04.2023 10:23

Также изучите developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… — такого понятия, как JSON, не существует. Это объект или строка JSON

mplungjan 20.04.2023 10:24

Итак, мое утверждение в теме должно быть... Мне не нужен результат в формате объекта {}, а формат массива... В сообщении, о котором я упоминал, результат находится в объекте в формате {}

user21357723 20.04.2023 10:39

это то, что ты говорил?

user21357723 20.04.2023 10:39

Собственно, это я и имел в виду

mplungjan 20.04.2023 13:13

Это должно работать:

const input = [
  {
    "name": "ABC Equity",
    "category": "Equity"
  },
  {
    "name": "EBC Bonds",
    "category": "Bond"
  },
  {
    "name": "Corporate Bonds",
    "category": "Bond"
  },
  {
    "name": "Private Equity",
    "category": "Equity"
  },
  {
    "name": "Fixed abc",
    "category": "Fixed"
  }
]

let grouped = input.reduce((arr, cur) => {
  let group = arr.find(i => i.label == cur.category)
  if (group) {
    group.options.push(cur)
  } else {
    arr.push({ label: cur.category, options: [cur] })
  }
  return arr
}, [])

console.info(grouped)

Это работает, но O (n ^ 2)

mplungjan 20.04.2023 10:18

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