Javascript 避免在以下情况下嵌套贴图;“旋转”;多维数组
我有格式的数据Javascript 避免在以下情况下嵌套贴图;“旋转”;多维数组,javascript,arrays,data-structures,functional-programming,lodash,Javascript,Arrays,Data Structures,Functional Programming,Lodash,我有格式的数据 [ { "timeline_map": { "2017-05-06": 770, "2017-05-07": 760, "2017-05-08": 1250 ... } }, { "timeline_map": { "2017-05-06": 590, "2017-05-07": 210, "2017-05-08": 300 ...
[
{
"timeline_map": {
"2017-05-06": 770,
"2017-05-07": 760,
"2017-05-08": 1250
...
}
},
{
"timeline_map": {
"2017-05-06": 590,
"2017-05-07": 210,
"2017-05-08": 300
...
}
},
{
"timeline_map": {
"2017-05-06": 890,
"2017-05-07": 2200,
"2017-05-08": 1032
...
}
}
]
[
["2017-05-06", 770, 590, 890, ...],
["2017-05-07", 760, 210, 2200, ...],
["2017-05-08", 1250, 300, 1032, ...]
]
为了在谷歌图表中使用,我需要改变格式
[
{
"timeline_map": {
"2017-05-06": 770,
"2017-05-07": 760,
"2017-05-08": 1250
...
}
},
{
"timeline_map": {
"2017-05-06": 590,
"2017-05-07": 210,
"2017-05-08": 300
...
}
},
{
"timeline_map": {
"2017-05-06": 890,
"2017-05-07": 2200,
"2017-05-08": 1032
...
}
}
]
[
["2017-05-06", 770, 590, 890, ...],
["2017-05-07", 760, 210, 2200, ...],
["2017-05-08", 1250, 300, 1032, ...]
]
我写了以下内容来进行转换
let mapped = _.map(
chartData.results[0].timeline_map, (timestampVal, timestampKey) => (
[timestampKey].concat(
_.map(
chartData.results, lineData => (
lineData.timeline_map[timestampKey]
)
)
)
)
)
这是可行的,但我认为嵌套映射
s不是一个好主意,因为它将通过映射数组长度的平方增加循环量。这里有没有更好的方法来达到预期的效果
您可以在哈希表上使用闭包,并相应地将值分配给日期键
var数据=[{时间线图:{“2017-05-06”:770,“2017-05-07”:760,“2017-05-08”:1250},{时间线图:{“2017-05-06”:590,“2017-05-07”:210,“2017-05-08”:300},{时间线图:{“2017-05-06”:890,“2017-05-07”:2200,“2017-05-08”:1032}],
分组=数据.reduce(函数(散列){
返回函数(r,o){
Object.keys(o.timeline\u map).forEach(函数(k){
如果(!散列[k]){
散列[k]=[k];
r、 push(散列[k]);
}
hash[k].push(o.timeline_-map[k]);
});
返回r;
};
}(Object.create(null)),[]);
控制台日志(分组)代码>
.as console wrapper{max height:100%!important;top:0;}
您可以在哈希表上使用闭包,并相应地将值分配给日期键
var数据=[{时间线图:{“2017-05-06”:770,“2017-05-07”:760,“2017-05-08”:1250},{时间线图:{“2017-05-06”:590,“2017-05-07”:210,“2017-05-08”:300},{时间线图:{“2017-05-06”:890,“2017-05-07”:2200,“2017-05-08”:1032}],
分组=数据.reduce(函数(散列){
返回函数(r,o){
Object.keys(o.timeline\u map).forEach(函数(k){
如果(!散列[k]){
散列[k]=[k];
r、 push(散列[k]);
}
hash[k].push(o.timeline_-map[k]);
});
返回r;
};
}(Object.create(null)),[]);
控制台日志(分组)代码>
.as控制台包装{max height:100%!important;top:0;}
使用.mergeWith()
合并对象,然后将结果对象合并到数组中:
const arr=[{
“时间线图”:{
"2017-05-06": 770,
"2017-05-07": 760,
"2017-05-08": 1250
}
},
{
“时间线图”:{
"2017-05-06": 590,
"2017-05-07": 210,
"2017-05-08": 300
}
},
{
“时间线图”:{
"2017-05-06": 890,
"2017-05-07": 2200,
"2017-05-08": 1032
}
}
];
const result=u.map(u.mergeWith({},…arr,(o1,o2)=>{
if(Array.isArray(o1)){
o1.推动(o2)
返回o1;
}
如果(u.isNumber(o2)){
返回[o2];
}
}).timeline_map,(v,k)=>[k,…v]);
控制台日志(结果)代码>
使用.mergeWith()
合并对象,然后.map()
将结果对象合并到数组中:
const arr=[{
“时间线图”:{
"2017-05-06": 770,
"2017-05-07": 760,
"2017-05-08": 1250
}
},
{
“时间线图”:{
"2017-05-06": 590,
"2017-05-07": 210,
"2017-05-08": 300
}
},
{
“时间线图”:{
"2017-05-06": 890,
"2017-05-07": 2200,
"2017-05-08": 1032
}
}
];
const result=u.map(u.mergeWith({},…arr,(o1,o2)=>{
if(Array.isArray(o1)){
o1.推动(o2)
返回o1;
}
如果(u.isNumber(o2)){
返回[o2];
}
}).timeline_map,(v,k)=>[k,…v]);
控制台日志(结果)代码>
[“2017-05-06”:770590890,…]
这不是有效的JS。无论是[“2017-05-06”、…]、[“2017-05-07”、…]
还是{“2017-05-06”:[…]、“2017-05-07”:[…]
。这是哪一个?@Thomas这只是一个省略号,表示还有更多的日期。链接的JSBIN没有任何类似的伪元素。我不是说省略号,我是说:
@Thomas-Ah。哎呀。更正。谢谢对象的一维数组。[“2017-05-06”:770590890,…]
这不是有效的JS。无论是[“2017-05-06”、…]、[“2017-05-07”、…]
还是{“2017-05-06”:[…]、“2017-05-07”:[…]
。这是哪一个?@Thomas这只是一个省略号,表示还有更多的日期。链接的JSBIN没有任何类似的伪元素。我不是说省略号,我是说:
@Thomas-Ah。哎呀。更正。谢谢一维对象数组。这是正确的方法,但只需要再向前一步就可以得到想要的结果。@Redu,你知道想要的结果吗?o其他参数由reduce方法提供。这些(Object.create(null)),[])
?对象。create(null)
在闭包中初始化散列
。空数组是结果数组的起始值。这是正确的方法,但只需再向前一步即可得到所需的结果。@Redu,您知道所需的结果吗?o其他参数由reduce方法提供。这些(Object.create(null)),[])
?对象。create(null)
在闭包中初始化散列
。空数组是结果数组的起始值。+1表示干净的溶液。只需指出,在数组达到一定大小后,spread运算符将开始给出调用堆栈溢出错误。+1表示非常干净的解决方案。只是指出,在数组达到一定大小后,spread运算符将开始给出调用堆栈溢出错误。