как я могу создать новый массив из большого API, удалив некоторые элементы и добавив значения - PullRequest
2 голосов
/ 11 июля 2020

Это фальшивые данные, которые я сделал для тестирования:

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
    },
]

Давайте просто представим, что мы работаем с API с более чем 100 странами и многими другими городами. Как мне создать новый массив из этого массива, который выглядит следующим образом:

const finalData = [
    {
        country: 'US',
        population: 2000
    },
    {
        country: 'CA',
        population: 2000
    },
    {
        country: 'CH',
        population: 2000
    },
]

Итак, в основном группирую их на основе их стран и добавляя население из городов с той же страной.

Ответы [ 3 ]

2 голосов
/ 11 июля 2020

Вы можете построить 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);
1 голос
/ 11 июля 2020

Используйте Array#reduce.

let finalData = data.reduce((acc,curr)=>{
     let obj = acc.find(({country})=>country===curr.country);
     if(obj){
         obj.population += curr.population;
     } else {
         acc.push({country:curr.country,population:curr.population});
     }
     return acc;
}, []);
0 голосов
/ 11 июля 2020

Подход с использованием метода поиска массива

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
    },
]


var finalArray=[];
data.forEach(obj => {
    
    let temp = finalArray.find( ob => ob['country'] === obj.country );
if(temp!==undefined){
    temp.population +=obj.population;
} else {
  finalArray.push({country:obj.country,population:obj.population})
}

});

console.log(finalArray)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...