我有这样一个输入对象,我应该修改它,以便与一些图表库一起使用它。
const input = {
foo: {
bar: 'biz',
},
statistic: {
"2019-11": {
A: 11,
B: 11,
C: 11,
D: 11,
E: 11,
},
"2019-12": {
A: 12,
B: 12,
C: 12,
D: 12,
E: 12,
},
....
}
};我的库需要这样的输入:
[
{ subject: 'A', '2019-11': 11, '2019-12': 12 },
{ subject: 'B', '2019-11': 11, '2019-12': 12 },
{ subject: 'C', '2019-11': 11, '2019-12': 12 },
{ subject: 'D', '2019-11': 11, '2019-12': 12 },
{ subject: 'E', '2019-11': 11, '2019-12': 12 }
]这是我目前的解决方案:
const transform = arg => {
const keys = ['A', 'B', 'C', 'D', 'E'];
return _.map(keys, key => {
const data = _.reduce(arg.statistic, (result, value, k) => {
result[k] = value[key];
return result;
}, {});
return {
subject: key,
...data
}
});
}任何改进都将是非常欢迎的!
发布于 2020-01-25 04:13:24
这里有五个数据序列(A到E)?当您有4或6个数据系列时,会发生什么?你真的想重写你的代码吗?
另外,除非你有理由这样做,否则这些简单的数据转换似乎没有必要。我猜想,使用ES6 Array.map、Array.reduce和类似的工具会做同样的事情,同时也会产生一种更流畅、更易读的风格。
发布于 2020-01-25 05:38:26
使用reduce构建映射对象听起来是错误的。根据定义,减少一词的意思是“使更小”,但你在这里使用它“使更大”。第一步可能是:
const data = {};
_.foreach(arg.statistic, (key, value) => data[key] = value);我不知道寄宿是否真的有foreach,这只是为了说明这个想法。
可能还有一种更优雅的方法从数据中创建此地图。
https://codereview.stackexchange.com/questions/236112
复制相似问题