簡體   English   中英

如何將此表格mysql結果轉換為節點中的分層數據結構?

[英]How convert this tabular mysql result into a hierarchical data structure in node?

我正在研究一個小節點/快速實用程序,它將返回一個對象數組,每個對象都有一個日期和一個值數組:

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()調用似乎應該相當簡單,但我很難讓它工作。

我可能會使用Underscore.js庫:

_.chain([
  { 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 }
]).groupBy(function(el) {
  return el.date;
}).map(function(val, key) {
  return { date: key, values: val };
}).value();

結果:

[
  {
    "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 }
    ]
  }
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM