基本上我想透视动态数组,例如我从MySQL表中获得的该数组:
[ { ruleAlias: 'DEMAND', date: '2019-03-22', count: 10 },
{ ruleAlias: 'VOUCHER', date: '2019-03-25', count: 20 },
{ ruleAlias: 'DEMAND', date: '2019-03-25', count: 10 },
{ ruleAlias: 'BILL', date: '2019-03-25', count: 2 },
{ ruleAlias: 'BILL', date: '2019-05-06', count: 1 } ]
我希望这个数组变成:
[ ['RULE', 'DEMAND', 'VOUCHER', 'BILL'],
['2019-03-22', 10, 0, 0],
['2019-03-25', 10, 20, 2],
['2019-05-06', 0, 0, 1]
]
这是我使用的MySQL查询:
SELECT ruleAlias, date, count
FROM (
SELECT ruleAlias, DATE_FORMAT(createDate, '%Y-%m-%d') AS date, COUNT(DATE_FORMAT(createDate, '%Y-%m-%d')) AS count FROM histPoint WHERE ruleAlias IN (SELECT alias FROM mstRule WHERE clientId = 5) AND YEAR(createDate) = YEAR(CURDATE()) GROUP BY date, ruleAlias
) AS t
我获取的数据是动态的,例如上面的数据是3条规则,但是来自表的数据可以获取3条以上的规则,如何将这种数组转换为javascript中的预期输出或直接转换为sql? >
答案 0 :(得分:0)
您可以获取一个哈希表,并收集给定日期/规则对的所有值。然后构建一个表,并为未给定的对使用默认零。
const key = (...a) => a.join('|');
var data = [{ ruleAlias: 'DEMAND', date: '2019-03-22', count: 10 }, { ruleAlias: 'VOUCHER', date: '2019-03-25', count: 20 }, { ruleAlias: 'DEMAND', date: '2019-03-25', count: 10 }, { ruleAlias: 'BILL', date: '2019-03-25', count: 2 }, { ruleAlias: 'BILL', date: '2019-05-06', count: 1 }],
temp = {},
result,
dates = new Set,
rules = new Set;
data.forEach(({ ruleAlias, date, count }) => {
dates.add(date);
rules.add(ruleAlias);
temp[key(date, ruleAlias)] = (temp[key(date, ruleAlias)] || 0) + count;
});
result = [
['RULE', ...rules],
...Array.from(dates, date => [
date,
...Array.from(rules, rule => temp[key(date, rule)] || 0)
])
];
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }