【问题标题】:Iterate through object keys and values and return a new object遍历对象键和值并返回一个新对象
【发布时间】:2017-12-14 18:50:44
【问题描述】:

我有一个对象数组,它们共享共同的属性名称,但具有不同的值。例如,它们是这样的:

let data = [
    {
      value1: "11:00",
      value2: 0.737462,
      value3: 1.345341,
      value4: 0.684655
    },
    {
      value1: "12:00",
      value2: 0.894368,
      value3: 1.55891,
      value4: 0.784655
    },
    {
      value1: "13:00",
      value2: 1.140516,
      value3: 1.938695,
      value4: 0.454655
    }
]

从这些对象中,我需要形成一个新的对象数组,类似于这样:

let datasets = [
    {
        label: "value1",
        data: ["11:00", "12:00", "13:00"]
    },
    {
        label: "value2",
        data: [0.737462,0.894368,1.140516,]
    }
    // and so on
]

这样我的数据集中的每个对象都将包含原始对象的属性名称作为label 的值以及与该名称对应的属性数组。我试过这样做:

let datasets = data.map((n) => {
    for (i in n) {
        return {
            label: i,
            data: data.map(obj => obj[i])
        }
    }
});

但它并没有按预期工作——它只返回一个对象数组,其中只有第一个属性名称作为标签。我想这是因为它在到达for...in 循环中的第一项后立即返回,但我想不出更好的方法来实现我所需要的。

【问题讨论】:

    标签: javascript arrays javascript-objects


    【解决方案1】:

    预期数组中的元素数等于数组元素中的键数,因此对其进行映射,然后运行另一个简单映射以生成数据数组。

    var out = Object.keys(data[0]).map(function(key) {
      return {
        label: key,
        data: data.map(function(obj) {
          return obj[key];
        })
      };
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用 reduce() 和 ES6 Map 来做到这一点。

      let data = [{"value1":"11:00","value2":0.737462,"value3":1.345341,"value4":0.684655},{"value1":"12:00","value2":0.894368,"value3":1.55891,"value4":0.784655},{"value1":"13:00","value2":1.140516,"value3":1.938695,"value4":0.454655}]
      
      var result = [...data.reduce(function(r, e) {
        return Object.keys(e).forEach(k => {
          if(!r.has(k)) r.set(k, {label: k, data: [e[k]]})
          else r.get(k).data.push(e[k])
        }), r
      }, new Map).values()]
      
      console.log(result)

      【讨论】:

      【解决方案3】:
      const datasets = data.reduce((acc, a) => {
          return acc.map(set => Object.assign({}, set, { data: set.data.concat(a[set.label])}));
      }, Object.keys(data[0]).map(k => ({label: k, data: []})));
      

      工作小提琴here.

      【讨论】:

        猜你喜欢
        • 2020-07-21
        • 2021-10-05
        • 2011-10-12
        • 2013-03-02
        • 1970-01-01
        • 2018-08-04
        • 2019-07-01
        • 2021-12-16
        • 2019-11-01
        相关资源
        最近更新 更多