Echart数据转换(水平数据变成垂直数据)
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);