Я видел аналогичный вопрос в 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'}
],
},
]
Чтобы преобразовать объект, созданный с помощью редукции, вам нужно взять значения объекта после редукции.
Обратите внимание на использование нулевого объединяющего присваивания операторов ??=
Этот код 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'}"?
потому что я все еще не совсем понимаю не относящуюся к делу часть?
Нет. JSON — это строковое представление объектов JavaScript. Это то, что вы получаете, когда делаете JSON.stringify(obj)
, где obj может быть объектом {}
или массивом (который также является объектом) []
Пожалуйста, взгляните на javascript-object-vs-json
Также изучите developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… — такого понятия, как JSON, не существует. Это объект или строка JSON
Итак, мое утверждение в теме должно быть... Мне не нужен результат в формате объекта {}, а формат массива... В сообщении, о котором я упоминал, результат находится в объекте в формате {}
это то, что ты говорил?
Собственно, это я и имел в виду
Это должно работать:
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)
сгруппируйте в объект, например
{Equity: {label:Equity,options:[...]},....}
, а затем используйтеObject.values
на объекте