var originaldatalist = [
{
name: "周一",
data: [
{
name: "直接访问",
data: 320
},
{
name: "邮件营销",
data: 120
},
{
name: "联盟广告",
data: 220
},
{
name: "视频广告",
data: 150
},
{
name: "搜索引擎",
data: 820
}
]
},
{
name: "周二",
data: [
{
name: "直接访问",
data: 302
},
{
name: "邮件营销",
data: 132
},
{
name: "联盟广告",
data: 182
},
{
name: "视频广告",
data: 212
},
{
name: "搜索引擎",
data: 832
}
]
},
{
name: "周三",
data: [
{
name: "直接访问",
data: 301
},
{
name: "邮件营销",
data: 101
},
{
name: "联盟广告",
data: 191
},
{
name: "视频广告",
data: 201
},
{
name: "搜索引擎",
data: 901
}
]
}
]

转换成

    var datalist = [
{
name: "直接访问",
data: [320, 302, 301, 334, 390, 330, 320]
},
{
name: "邮件营销",
data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: "联盟广告",
data: [220, 182, 191, 234, 290, 330, 310]
},
{
name: "视频广告",
data: [150, 212, 201, 154, 190, 330, 410]
},
{
name: "搜索引擎",
data: [820, 832, 901, 934, 1290, 1330, 1320]
}
];

1、使用三层循环

    var yAxis = [];
var datalist = [];
for (var i = 0; i < originaldatalist.length; i++) {
yAxis.push(originaldatalist[i].name);
for (var j = 0; j < originaldatalist[i].data.length; j++) {
//判断是否有值
var tempk = -1;
for (var k = 0; k < datalist.length; k++) {
if (datalist[k].name == originaldatalist[i].data[j].name) {
tempk = k;
}
}
//有值添加无值新建
if (tempk >= 0) {
datalist[tempk].data.push(originaldatalist[i].data[j].data);
} else {
var temp = {
name: originaldatalist[i].data[j].name,
data: [originaldatalist[i].data[j].data]
}
datalist.push(temp);
}
}
}

2、先使用concat扁平化为一个数组,再使用双循环合并同类项

 var yAxis = [];
var datalist = [];
for (var i = 0; i < originaldatalist.length; i++) {
yAxis = yAxis.concat(originaldatalist[i].name);
datalist = datalist.concat(originaldatalist[i].data);
}
for (var i = 0; i < datalist.length; i++) {
var listtemp = [datalist[i].data];
for (var j = i + 1; j < datalist.length; j++) {
if (datalist[i].name == datalist[j].name) {
listtemp.push(datalist[j].data);
datalist.splice(j, 1);
j--;
}
}
datalist[i].data = listtemp;
}

3、先使用concat扁平化,再使用reduce合并同类项

    var yAxis = [];
var datalist = [];
for (var i = 0; i < originaldatalist.length; i++) {
yAxis = yAxis.concat(originaldatalist[i].name);
datalist = datalist.concat(originaldatalist[i].data);
}
var xx = datalist.reduce(function (res, item) {
//findIndex: 传入一个测试条件(函数)符合条件的数组第一个元素位置。
var index = res.findIndex(function (v) {
return v.name == item.name;
});
if (index > -1) {
if (Array.isArray(res[index].data)) {
res[index].data.push(item.data);
} else {
var listtemp = [res[index].data];
listtemp.push(item.data);
res[index].data = listtemp;
}
} else {
res.push(item);
}
return res;
}, []);
datalist = xx;
console.log(yAxis.join(","));
console.log(datalist);

4、先扁平化,后使用哈希(hash)来合并同类项

    var yAxis = [];
var datalist = [];
for (var i = 0; i < originaldatalist.length; i++) {
yAxis = yAxis.concat(originaldatalist[i].name);
datalist = datalist.concat(originaldatalist[i].data);
}

  //用个hash表存一下name在结果里对应的位置,就能将时间复杂度从幂函数降低到线性的时间复杂度
var hashTable = {};
var datalist = datalist.reduce(function (result, _ref) {
var name = _ref.name, data = _ref.data;
hashTable[name] !== undefined ? result[hashTable[name]].data.push(data) : hashTable[name] = result.push({
name: name,
data: [data]
}) - 1;
return result;
}, []);
console.log(yAxis.join(","));
console.log(datalist);

Echart数据转换(水平数据变成垂直数据)的更多相关文章

  1. 将undefault和null的数据转换成bool类型的数据 使用!!

    <script> var o={}; var a=null; console.info(!!o.name); </script> 输出false 此方法是将undefault和 ...

  2. Android中如何将Bitmap byte裸数据转换成Bitmap图片int数据

    Android中如何将Bitmap byte裸数据转换成Bitmap图片int数据 2014-06-11 10:45:14   阅读375次 我们在JNI中处理得到的BMP图片Raw数据,我们应该如何 ...

  3. C# 封装SDK 获取摄像头的水平角度和垂直角度

    最近需要做一个C#版本的控制终端,控制摄像头,获取摄像头的水平角度和垂直角度 获取当前摄像头的角度,需要调用一个名为NET_DVR_GetDVRConfig的bool类型的函数 在C++中,函数定义: ...

  4. 理解水平扩展和垂直扩展 (转载 http://yunjiechao-163-com.iteye.com/blog/2126981)

      当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展.选用哪种策略主要依赖于要解决的问题 以及系统资源的限制.在这篇文章中我们将讲述这两种策略并讨论每种策越的优缺点.如果你已经 ...

  5. Web 站点的水平扩展和垂直扩展 (译文)

    当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展.选 用哪种策略主要依赖于要解决的问题以及系统资源的限制.在这篇文章中我们将讲述这两种策略并讨论每种策越的优缺点.如果你已经有一 ...

  6. 数据库水平拆分和垂直拆分区别(以mysql为例)

    数据库水平拆分和垂直拆分区别(以mysql为例) 数据库水平拆分和垂直拆分区别(以mysql为例)   案例:     简单购物系统暂设涉及如下表: 1.产品表(数据量10w,稳定) 2.订单表(数据 ...

  7. 第六篇:R语言数据可视化之数据分布图(直方图、密度曲线、箱线图、等高线、2D密度图)

    数据分布图简介 中医上讲看病四诊法为:望闻问切.而数据分析师分析数据的过程也有点相似,我们需要望:看看数据长什么样:闻:仔细分析数据是否合理:问:针对前两步工作搜集到的问题与业务方交流:切:结合业务方 ...

  8. ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

    分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...

  9. mysql的水平拆分和垂直拆分

    转:http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从 ...

随机推荐

  1. vimrc同步文档

    目录 vimrc ims.vim vimrc if has("syntax") syntax on endif set nocompatible "取消vi 兼容模式 & ...

  2. UI自动化框架——构建思维

    目的:从Excel中获取列的值,传输到页面 技巧:尽可能的提高方法的重用率 Java包: 1.java.core包 3个类:1)日志(LogEventListener)扩展web driver自带的事 ...

  3. Windows 10 家庭版/专业版 彻底关闭windows update自动更新

    转载: https://blog.csdn.net/u014162133/article/details/84973426# https://blog.csdn.net/qq_40820862/art ...

  4. java8新特性--Stream的基本介绍和使用

    什么是Stream? Stream是一个来自数据源的元素队列并可以进行聚合操作. 数据源:流的来源. 可以是集合,数组,I/O channel, 产生器generator 等 聚合操作:类似SQL语句 ...

  5. Windows平台分布式架构实践 - 负载均衡(转载)

    Windows平台分布式架构实践 - 负载均衡 概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Li ...

  6. 018-并发编程-java.util.concurrent.locks之-ReentrantReadWriteLock可重入读写锁

    一.概述 ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程.写线程和写线程同时访问.相对 ...

  7. 转换编码utf-8

    用这个enca -x utf-8 * 或者是 filename,还有别的方法,参见:https://blog.csdn.net/a280606790/article/details/8504133 我 ...

  8. 53.CSS---CSS水平垂直居中常见方法总结

    CSS水平垂直居中常见方法总结 1.元素水平居中 当然最好使的是: margin: 0 auto; 居中不好使的原因: 1.元素没有设置宽度,没有宽度怎么居中嘛! 2.设置了宽度依然不好使,你设置的是 ...

  9. sublime开启vim模式

    sublime自带vim模式Vintage,只是默认是ignore状态,因此如果按Esc键没有进入vim模式,只需要按ctrl+shift+P进入命令模式,键入Enable package,输入Vim ...

  10. 即时通讯(III)

    即时通讯的开源库 目前及时通讯可以使用环信.柔云.腾讯云,这些都是基于TCP连接的,UI也是高度定制的,而且它们的技术也是比较成熟的. XMPP比较早,是开源的,但是坑也比较多.传输的数据是XML,造 ...