遍历对象键和值并返回一个新对象。

5

我有一个对象数组,这些对象具有共同的属性名称,但其值不同。例如:

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 循环中遇到第一项时就返回了,但我无法找到更好的方法来实现我需要的功能。

3个回答

5
预期数组中的元素数量等于数组元素中键(key)的数量,因此需要对其进行映射(map) ,然后运行另一个简单的映射来生成数据数组。
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)


注意:它适用于像这样的情况 https://jsfiddle.net/Lg0wyt9u/2593/ - Nenad Vracar

0
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: []})));

这里有一个可工作的 Fiddle 链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接