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. Cookie:解决HTTP协议无保存状态

    客户端 Cookie会根据从服务器端发送的相应报文内一个叫Set-Cookie的首部字段信息,通知客户端保存Cookie.当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值 ...

  2. EXT的bug 布局border 和 grid的cellediting

    首先 我要的布局是上下两块,并且高度和按自己的喜欢可调节,所以我采用的是border的布局, 上下两块,都放grid列表,上面一块不可编辑,下面这块可编辑,如图 在编辑第二块的时候会出现这个现象 图一 ...

  3. java框架之Quartz-任务调度&整合Spring

    准备 介绍 定时任务,无论是互联网公司还是传统的软件行业都是必不可少的.Quartz,它是好多优秀的定时任务开源框架的基础,使用它,我们可以使用最简单基础的配置来轻松的使用定时任务. Quartz 是 ...

  4. Ethzasl MSF源码阅读(2):百川汇海

    这里有个感觉,就是百川汇海.即IMU数据和相机的消息数据都汇集到msf_core进行处理.接上一篇, 1. 查看IMUHandler_ROS::IMUCallback和IMUHandler_ROS:: ...

  5. oracle_18c新建用户用normal登陆失败

    工具介绍:win10系统,使用的是oracle18c. 首先说一下oracle18c的特性,在oracle18c创建用户要以c##开头,比如: --创建新用户create user c##test_u ...

  6. 如何为 SpringMVC 编写单元测试:普通 Controller 测试(转)

    前一篇文章我们已经知道如何配置使用了 SpringMVC 测试框架的单元测试. 现在我们就该亲身实践下如何为普通 Controller 编写单元测试了. 接下来一个很明显的问题就是: 什么是普通 Co ...

  7. tensorflow神奇问题

    运行tensorflow程序时,遇到了各种奇葩的问题,比如: 1.Import Error: DLL load failed: The specified module could not be fo ...

  8. Python类的私有属性

    class Bar(object): __age = 18 sex = 'male' def __init__(self, ): pass def f(self): print(self.__age) ...

  9. Python 协程实现socket并发

    socket多并发 socket可以实现单个客户端进行请求访问,它可以通过socketserver来实现并发功能呢,socketserver是通过启用多线程实现并发,在这里我们也可以通过gevent协 ...

  10. rds下载备份集

    python版本[testuser@localhost tmp]$ python -VPython 2.7.5 需要提前安装RDS[root@localhost ~]# yum -y install ...