Задать вопрос
Artem3677
@Artem3677
Учусь

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

Есть массив объектов:

let data = [
	{ country: 'country1', city:    'city11' },
	{ country: 'country2', city:    'city21' },
	{ country: 'country3', city:    'city31' },
	{ country: 'country1', city:    'city12' },
	{ country: 'country1', city:    'city13' },
	{ country: 'country2', city:    'city22' },
	{ country: 'country3', city:    'city31' },
];

Нужно превратить его в объект, где ключами будут значения свойства country, а значениями массивы соответствующих значений свойства city:

{
	'country1': [ 'city11', 'city12', 'city13' ],
	'country2': [ 'city21', 'city22' ],
	'country3': [ 'city31', 'city32' ],
}

Я сделал костыль:

let set = new Set;

for (let obj of data) {
set.add(obj.country);
}

let arr = [...set];

let arr1 = [];
let arr2 = [];
let arr3 = [];

for (let obj of data) {
if (obj.country === arr[0]) {
arr1.push(obj.city);
}

if (obj.country === arr[1]) {
arr2.push(obj.city);
}

if (obj.country === arr[2]) {
arr3.push(obj.city);
}
}

let subarr = [];
subarr.push(arr1, arr2, arr3);

let obj = {};
for(let i = 0; i < arr.length; i++) {
obj[arr[i]] = subarr[i];
}
console.log(obj);

Но нужно сделать универсальное решение.
  • Вопрос задан
  • 126 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const result = data.reduce(
  (acc, cur) => ((acc[cur.country] ??= []).push(cur.city), acc),
  {},
);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы