[英]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.