Javascript 如何将此表格mysql结果转换为节点中的分层数据结构?

Javascript 如何将此表格mysql结果转换为节点中的分层数据结构?,javascript,node.js,Javascript,Node.js,我正在使用一个小型节点/express实用程序,它将返回一个对象数组,每个对象都有一个日期和一个值数组: var desired_result = [ { date: "2015-09-21", values: [ { value: "val_a", score: 2 }, { value: "val_b", score: 4 } ], { date: "2015-09-22", values: [ { value: "val_a", score: 4 },

我正在使用一个小型节点/express实用程序,它将返回一个对象数组,每个对象都有一个日期和一个值数组:

var desired_result = [
  { date: "2015-09-21", values: [
    { value: "val_a", score: 2 },
    { value: "val_b", score: 4 }
  ],
  { date: "2015-09-22", values: [
    { value: "val_a", score: 4 },
    { value: "val_b", score: 8 }
  ]
]
此数据来自mysql查询,每个日期都有多个值,如:

var mysql_results = [
  { date: "2015-09-21", value: "val_a", score: 2 },
  { date: "2015-09-21", value: "val_b", score: 4 },
  { date: "2015-09-22", value: "val_a", score: 4 },
  { date: "2015-09-22", value: "val_b", score: 8 }
]
调用
.reduce()
似乎应该很简单,但我很难让它正常工作。

我可能会使用这个库:

结果:

[
  {
    "date": "2015-09-22",
    "values": [
      {
        "date": "2015-09-22",
        "value": "val_a",
        "score": 2
      },
      {
        "date": "2015-09-22",
        "value": "val_b",
        "score": 4
      },
      {
        "date": "2015-09-22",
        "value": "val_a",
        "score": 4
      },
      {
        "date": "2015-09-22",
        "value": "val_b",
        "score": 8
      }
    ]
  }
]

我设法使
.reduce()
方法起作用;这种方法取决于按日期排序的数组(在我的sql查询中完成)

解决方案:

var mysql_results = [
  { date: "2015-09-21", value: "val_a", score: 2 },
  { date: "2015-09-21", value: "val_b", score: 4 },
  { date: "2015-09-22", value: "val_a", score: 4 },
  { date: "2015-09-22", value: "val_b", score: 8 }
]

var output = mysql_results
    .map(function (result) {
        // format the records as { date, values: [] }
        return {
            date: result.date,
            values: [{value: result.value, score: result.score}]
        }
    })
    .reduce(function (result, cur) {

        if (!result.length) {
            // no previous records
            result.push(cur);
            return result;
        }

        var prev = result[result.length - 1];
        if (prev.date === cur.date) {

            // prev record has same date - merge values
            prev.values = prev.values.concat(cur.values)
            result[result.length - 1] = prev;
            return result;

        }

        // dates don't match, add new record
        result.push(cur);
        return result;

    }, []);
产生

[
  { date: "2015-09-21", values: [
      { value: "val_a", score: 2 },
      { value: "val_b", score: 4 }
    ]
  },
  {
    date: "2015-09-22", values: [
      { value: "val_a", score: 4 },
      { value: "val_b", score: 8 }
    ]
  }
]

您拥有的是一个数组对象,而不是JSON.hmm。。。是什么让你将两组不同的val_a和val_b分离到同一个日期,但在两个不同的对象中?那是两个分开的日期吗?如果它们是单独的日期,mysql可以使用分组和求和来减少这些日期。@FelixKling-哎呀,疏忽了。它的末尾是
res.json()
'd,那么在它上面循环几乎是唯一的选择。你有没有写过不起作用的东西?@KevinB我忽略了你第一次评论的意思——应该有两个不同的日期,每个日期都有自己的一组值,我修正了它,只是注意到我的示例数据有一个错误(应该有两个不同的日期)。我刚刚更新了样本,如果你想更新你的答案,我的答案应该对新样本数据没有问题。
[
  { date: "2015-09-21", values: [
      { value: "val_a", score: 2 },
      { value: "val_b", score: 4 }
    ]
  },
  {
    date: "2015-09-22", values: [
      { value: "val_a", score: 4 },
      { value: "val_b", score: 8 }
    ]
  }
]