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)