【问题标题】:Reducing an array of objects into a single object with its values being a concatenation of the values from the old array将对象数组减少为单个对象,其值是旧数组中值的串联
【发布时间】:2020-08-16 05:57:18
【问题描述】:

我有一个对象数组,我想将它们缩减为一个对象。示例数组在其每个对象中始终具有相同的键,如下所示:

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


    【解决方案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; }

    【讨论】:

      【解决方案2】:

      由于数组中的每个元素又是一个对象,因此您需要对其进行迭代

      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)

      【讨论】:

        【解决方案3】:

        您可以尝试reduce,方法是获取键、值形式的元素条目,然后在accumulator 中相应地使用for..of 推送它们:

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

        【讨论】:

          猜你喜欢
          • 2018-01-05
          • 1970-01-01
          • 2020-07-15
          • 1970-01-01
          • 2017-08-17
          • 1970-01-01
          • 1970-01-01
          • 2019-09-30
          • 2019-04-26
          相关资源
          最近更新 更多