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. zabbix3.2使用自带模板监控MySql

    一.zabbix自带MySql模板监控项 Zabbix3.0之后已经有MySql监控模板了,所以我们只要引用ZabbixServer自带的模板即可.zabbix默认有14个监控项 我们只需获取监控项需 ...

  2. CookieUitl

    import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.h ...

  3. [js]js的惰性声明, js中声明过的变量(预解释),后在不会重新声明了

    js的惰性声明, js中声明过的变量(预解释),后在不会重新声明了 fn(); // 声明+定义 js中声明过一次的变量,之后在不会重新声明了 function fn() { console.log( ...

  4. ionic3 在ios9.0 系统下 会出现ReferenceError:Can't find variable:Intl 错误提示

    ionic3 框架开发app  在ios 9.0版本中 ReferenceError:Can't find variable:Intl 错误提示: 在index.html 文件中添加 <scri ...

  5. 在CentOS 7中安装与配置Tomcat-8.5方法

    安装说明 安装环境:CentOS-7 安装方式:源码安装 软件:apache-tomcat-8.5.39.tar.gz下载地址:http://tomcat.apache.org/download-80 ...

  6. 百度富文本Ueditor编辑器的使用

    往在web开发的时候,尤其是在网站开发后台管理系统的时候经常会使用到富文本编辑器,这里我们来使用百度提供的富文本编辑器UEditor,以提高我们的开发效率 UEditor官网下载地址:https:// ...

  7. 即时通讯(III)

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

  8. IDEA中文出现乱码解决(转)

    转自:http://lcl088005.iteye.com/blog/2284696 我是个idea的忠实用户,新公司的项目都是用eclipse做的,通过svn拉下代码后发现,注释的内容里,中文内容都 ...

  9. 20175208 《Java程序设计》第四周学习总结

    第五章主要学习内容 1.子类的继承性: (1)子类与父类在同一包中的继承性:子类自然地继承了其父类中不是private的成员变量作为自己的成员变量. (2)子类与父类不在同一包中的继承性:子类只继承父 ...

  10. 转:在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档

    在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档 一直以来,我都想为 PDF 补丁丁添加一个 PDF 渲染引擎.可是,目前并没有可以在 .NET 框架上运行的免费 PDF ...