Сокращение массива объектов в единый объект со значениями, являющимися объединением значений из старого массива - PullRequest
0 голосов
/ 01 мая 2020

У меня есть массив объектов, которые я хочу свести в один объект. Образец массива всегда имеет одинаковые ключи в каждом из своих объектов, как показано ниже:

sample = [
    {australia: 0, belgium: 0, brazil: 0, canada: 1, china: 1, ...},
    {australia: 0, belgium: 0, brazil: 3, canada: 2, china: 2, ...},
    {australia: 2, belgium: 1, brazil: 4, canada: 2, china: 5, ...}
]

Я ищу получить один объект, ключи которого такие же, как в объектах, а значения являются конкатенация каждого значения в исходном массиве. Примерно так:

desiredResult: {australia:[0,0,2],belgium:[0,0,1],brazil:[0,3,4],canada:[1,2,2],china:[1,2,5],...}

До сих пор я пробовал следующий метод Reduce для массива, но мне не хватает части, где я объединяю все значения:

let desiredResult = sample.reduce((a,b) =>({...a, desiredResult: b}),{})

// Which results in:
// desiredResult: {australia: 2, belgium: 1, brazil: 4, canada: 2, china: 5}

¿ Не могли бы вы помочь мне найти лучший способ достичь этого решения?

Ответы [ 3 ]

1 голос
/ 01 мая 2020

Так как каждый элемент в массиве снова является объектом, вам нужно их итерировать

let sample = [{
    'australia': 0,
    'belgium': 0,
    'brazil': 0,
    'canada': 1,
    'china': 1
  },
  {
    'australia': 0,
    'belgium': 0,
    'brazil': 3,
    'canada': 2,
    'china': 2
  },
  {
    'australia': 2,
    'belgium': 1,
    'brazil': 4,
    'canada': 2,
    'china': 5
  }
];

let newData = sample.reduce((acc, curr) => {
  for (let keys in curr) {
    if (!acc[keys]) {
      acc[keys] = []
    }
    acc[keys].push(curr[keys])
  }
  return acc;
}, {});

console.log(newData)
1 голос
/ 01 мая 2020

Вы можете получить записи и создать новые свойства в виде массива и pu sh значение для него.

var sample = [{ australia: 0, belgium: 0, brazil: 0, canada: 1, china: 1 }, { australia: 0, belgium: 0, brazil: 3, canada: 2, china: 2 }, { australia: 2, belgium: 1, brazil: 4, canada: 2, china: 5 }],
    result = sample.reduce((r, o) => {
        Object.entries(o).forEach(([k, v]) => (r[k] = r[k] || []).push(v));
        return r;
    }, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 01 мая 2020

Вы можете попробовать reduce, взяв записи элемента в ключе, форме значения и затем нажав их, используя for..of в accumulator соответственно:

var sample = [{ australia: 0, belgium: 0, brazil: 0, canada: 1, china: 1 }, { australia: 0, belgium: 0, brazil: 3, canada: 2, china: 2 }, { australia: 2, belgium: 1, brazil: 4, canada: 2, china: 5 }]
    
const result= sample.reduce((acc, elem)=>{
    countries= Object.entries(elem); 
    for(const [country, count] of countries){
    	  acc[country]= acc[country] || [];
    	  acc[country].push(count);
    	}
    	return acc;
},{});
console.log(result);
    
  
...