Вы можете построить Map
, используя .reduce()
, где карта привязана к свойству country
. Если вы встретите страну, которая уже есть на карте, вы можете добавить к ее значению, сохранив общее количество населения. Если страны нет на карте, вы можете добавить текущее население в качестве значения с новой страной в качестве ключа. Затем вы можете использовать Array.from()
для преобразования карты в массив, где вы можете предоставить функцию сопоставления для сопоставления записей с объектами:
const data = [ { country: 'US', city: 'NY', population: 1000 }, { country: 'CA', city: 'TOR', population: 1000 }, { country: 'US', city: 'LA', population: 1000 }, { country: 'CH', city: 'BEI', population: 1000 }, { country: 'CA', city: 'VAN', population: 1000 }, { country: 'CH', city: 'SHANG', population: 1000 }, ];
const res = Array.from(data.reduce(
(m, {country:c, population:p}) => m.set(c, (m.get(c) || 0) + p), new Map
), ([country, population]) => ({country, population}));
console.log(res);
Если ваша цель - удалить ключ city
и сохранить все остальные ключи (а не просто оставить только ключи country
и population
), тогда вы можно использовать следующее, которое удалит ключ city
, но оставит все остальные ключи:
const data = [ { country: 'US', city: 'NY', population: 1000 }, { country: 'CA', city: 'TOR', population: 1000 }, { country: 'US', city: 'LA', population: 1000 }, { country: 'CH', city: 'BEI', population: 1000 }, { country: 'CA', city: 'VAN', population: 1000 }, { country: 'CH', city: 'SHANG', population: 1000}, ];
const res = Array.from(data.reduce((m, {country, city, population, ...r}) => {
const curr = m.get(country) || {country, population: 0, ...r};
return m.set(country, {...curr, population: curr.population + population, ...r});
}, new Map).values());
console.log(res);