将一个对象数组缩减为一个对象,其值是旧数组中的值的连接。

问题描述 投票:0回答:3

我有一个对象数组,我想把它还原成一个对象。如下图所示,样本数组中的每个对象的键值总是相同的。

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}

你能帮我找出解决这个问题的最佳方法吗?

javascript arrays object reduce
3个回答
1
投票

你可以获取条目并创建新的属性作为数组,然后将值推送给它。

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; }

1
投票

由于数组中的每个条目都是一个对象,你需要对它们进行迭代。

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)

0
投票

你可以试试 reduce 通过将元素的条目以键和值的形式提取,然后用 for..ofaccumulator 据此。

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);
    
  
© www.soinside.com 2019 - 2024. All rights reserved.