js, как суммировать дублирующиеся значения JSON, или самого объекта JS

Есть JSON, там города дублируются. Нужно значения этих городов: количество жителей суммировать в один объект JS. Что то вроде

{
city:"Moscow",
population:"12 655 050"
},
{
city:"Moscow",
population:"12 655 050"
} в 
{
city:"Moscow",
population:"24 000 000"
}

У меня получилось сделать это, но код очень нечитаемый. И вообще зависит от структуры объекта.


Ответы (2 шт):

Автор решения: Vlad Brezitskiy

Можете попробовать таким образом. Также можно расширить функцию getSameField на дополнительный параметр и проверку на наличие свойства

const json = [
    {
        city:       "Moscow",
        population: "12 655 050"
    },
    {
        city:       "Moscow",
        population: "12 655 050"
    },
    {
        city: "test",
        population: "1231"
    }
];

let obj = [];

function getSameField(field) {
    for (let i = 0; i < obj.length; i++) {
        if (obj[i].city === field) return i;
    }
    return -1;
}

for (const item of json) {
    const index = getSameField(item.city);

    if (obj.length > 0 && index >= 0) {
        obj[index].population += Number(item.population.replace(/\s/g, ""));
    }
    else {
        obj.push({
            city: item.city,
            population: Number(item.population.replace(/\s/g, ""))
        })
    }
}

// Output obj
// [ { city: 'Moscow', population: 25310100 },
// { city: 'test', population: 1231 } ]
→ Ссылка
Автор решения: Aziz Umarov

Можно так через reduce. Только сразу оговорюсь, мне не понятно как вы получили population:"24 000 000" из суммы population:"12 655 050" и population:"12 655 050"

let population = [{
city:"Moscow",
population:"12 655 050"
},
{
city:"Moscow",
population:"12 655 050"
},
{
city:"Tashkent",
population:"2 655 050"
}];

let result = population.reduce( (acc, item) => {
  let exitingItem = acc.filter(item1=>item1.city == item.city)[0];
  if (exitingItem) { 
      exitingItem.population = ((+exitingItem.population.replace(/\s/g, "")) + (+item.population.replace(/\s/g, ""))).toLocaleString();}
  else { 
    acc.push(item);
  } 
  return acc;
 }, []);
  
console.log(result)

→ Ссылка