UNPKG

chartx

Version:

Data Visualization Chart Library

355 lines (340 loc) 10.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = _default; var _canvax = require("canvax"); /** * 把原始的数据 * field1 field2 field3 * 1 2 3 * 2 3 4 * 这样的数据格式转换为内部的 * [{field:'field1',index:0,data:[1,2]} ......] * 这样的结构化数据格式。 */ //如果应用传入的数据是[{name:name, sex:sex ...} , ...] 这样的数据,就自动转换为chartx需要的矩阵格式数据 function parse2MatrixData(list) { if (list === undefined || list === null) { list = []; } ; //检测第一个数据是否为一个array, 否就是传入了一个json格式的数据 if (list.length > 0 && !_canvax._.isArray(list[0])) { var newArr = []; var fields = []; var fieldNum = 0; for (var i = 0, l = list.length; i < l; i++) { var row = list[i]; if (i == 0) { for (var f in row) { fields.push(f); } ; newArr.push(fields); fieldNum = fields.length; } ; var _rowData = []; for (var ii = 0; ii < fieldNum; ii++) { _rowData.push(row[fields[ii]]); } ; newArr.push(_rowData); } ; return newArr; } else { return list; } } function parse2JsonData(list) { var newArr = list; //检测第一个数据是否为一个array, 否就是传入了一个json格式的数据 if (list.length > 0 && _canvax._.isArray(list[0])) { newArr = []; var fields = list[0]; var fl = fields.length; for (var i = 1, l = list.length; i < l; i++) { var obj = {}; for (var fi = 0; fi < fl; fi++) { obj[fields[fi]] = list[i][fi]; } ; newArr.push(obj); } ; return newArr; } ; } function _default(dataOrg, opt) { var dataFrame = { //数据框架集合 length: 0, org: [], //最原始的数据,一定是个行列式,因为如果发现是json格式数据,会自动转换为行列式 jsonOrg: [], //原始数据的json格式 data: [], //最原始的数据转化后的数据格式(range取段过后的数据):[o,o,o] o={field:'val1',index:0,data:[1,2,3]} getRowDataAt: _getRowDataAt, getRowDataOf: _getRowDataOf, getFieldData: _getFieldData, getDataOrg: getDataOrg, resetData: _resetData, fields: [], range: { start: 0, end: 0 }, filters: {} //数据过滤器,在range的基础上 }; function _init(dataOrg) { //数据的最外面一定是个数组 if (!Array.isArray(dataOrg)) { dataOrg = [dataOrg]; } if (!dataOrg || dataOrg.length == 0) { return dataFrame; } ; //检测第一个数据是否为一个array, 否就是传入了一个json格式的数据 if (dataOrg.length > 0 && !_canvax._.isArray(dataOrg[0])) { dataFrame.jsonOrg = dataOrg; dataOrg = parse2MatrixData(dataOrg); dataFrame.org = dataOrg; } else { dataFrame.org = dataOrg; dataFrame.jsonOrg = parse2JsonData(dataOrg); } ; //设置好数据区间end值 dataFrame.range.end = dataOrg.length - 1 - 1; //然后检查opts中是否有dataZoom.range if (opt) { //兼容下dataZoom 和 datazoom 的大小写配置 var _datazoom = opt.dataZoom || opt.datazoom; _datazoom && _datazoom.range && _canvax._.extend(dataFrame.range, _datazoom.range); } ; if (dataOrg.length && dataOrg[0].length && !~dataOrg[0].indexOf("__index__")) { //如果数据中没有用户自己设置的__index__,那么就主动添加一个__index__,来记录元数据中的index for (var i = 0, l = dataOrg.length; i < l; i++) { if (!i) { dataOrg[0].push("__index__"); } else { dataOrg[i].push(i - 1); dataFrame.jsonOrg[i - 1]["__index__"] = i - 1; } } } ; dataFrame.fields = dataOrg[0] ? dataOrg[0] : []; //所有的字段集合; return dataFrame; } function _resetData(dataOrg) { if (dataOrg) { //重置一些数据 dataFrame.org = []; dataFrame.jsonOrg = []; dataFrame.fields = []; dataFrame.data = []; var preRange = _canvax._.extend(true, {}, dataFrame.range); var preLen = dataFrame.length; //设置数据之前的数据长度 _init(dataOrg); dataFrame.data = _getDataAndSetDataLen(); //如果之前是有数据的情况,一些当前状态恢复到dataFrame里去 begin if (preLen !== 0) { if (opt && opt.dataZoom && opt.dataZoom.range) { //如果有配置过dataZoom.range, 那么就要回复最近一次的range _canvax._.extend(true, dataFrame.range, preRange); if (dataFrame.range.end > dataFrame.length - 1) { dataFrame.range.end = dataFrame.length - 1; } ; if (dataFrame.range.start > dataFrame.length - 1 || dataFrame.range.start > dataFrame.range.end) { dataFrame.range.start = 0; } ; } //一些当前状态恢复到dataFrame里去 end } else { //如果之前是没有数据的,那么就不用管了 } } else { //就算没有dataOrg,但是data还是要重新构建一边的,因为可能dataFrame上面的其他状态被外界改变了 //比如datazoom修改了dataFrame.range dataFrame.data = _getDataAndSetDataLen(); } } ; function _getDataAndSetDataLen() { var total = []; //已经处理成[o,o,o] o={field:'val1',index:0,data:[1,2,3]} for (var a = 0, al = dataFrame.fields.length; a < al; a++) { var o = {}; o.field = dataFrame.fields[a]; o.index = a; o.data = []; total.push(o); } ; var rows = _getValidRows(function (rowData) { _canvax._.each(dataFrame.fields, function (_field) { var _val = rowData[_field]; if (opt && opt.coord && (opt.coord.xAxis && _field == opt.coord.xAxis.field && opt.coord.xAxis.layoutType != 'proportion' || opt.coord.aAxis && _field == opt.coord.aAxis.field)) { //如果是x轴, 并且轴的layoutType不是 proportion ,这两者就不需要强制转换为number } else { //其他数据都需要保证是number //如果是可以转换为number的数据就尽量转换为number if (!isNaN(_val) && _val !== "" && _val !== null) { _val = Number(_val); } ; } var gData = _canvax._.find(total, function (g) { return g.field == _field; }); gData && gData.data.push(_val); }); }); //到这里保证了data一定是行列式 dataFrame.length = rows.length; return total; } ; function _getValidRows(callback) { var validRowDatas = []; _canvax._.each(dataFrame.jsonOrg.slice(dataFrame.range.start, dataFrame.range.end + 1), function (rowData) { var validRowData = true; if (_canvax._.keys(dataFrame.filters).length) { _canvax._.each(dataFrame.filters, function (filter) { if (_canvax._.isFunction(filter) && !filter(rowData)) { validRowData = false; return false; } ; }); } ; if (validRowData) { callback && callback(rowData); validRowDatas.push(rowData); } ; }); return validRowDatas; } ; //会按照$field的格式转换成对应一一对应的 org 的结构 function getDataOrg($field, format, totalList, lev) { if (!lev) lev = 0; var arr = totalList || _getDataAndSetDataLen(); if (!arr) { return; } if (!format) { format = function format(e) { return e; }; } ; function _format(d) { for (var i = 0, l = d.length; i < l; i++) { d[i] = format(d[i]); } ; return d; } ; if (!_canvax._.isArray($field)) { $field = [$field]; } ; //这个时候的arr只是totalList的过滤,还没有完全的按照$field 中的排序 var newData = []; for (var i = 0, l = $field.length; i < l; i++) { var fieldInTotal = false; //如果该field在数据里面根本没有,那么就说明是无效的field配置 if (_canvax._.isArray($field[i])) { newData.push(getDataOrg($field[i], format, totalList, lev + 1)); } else { var _fieldData = newData; if (!lev) { _fieldData = []; } ; for (var ii = 0, iil = arr.length; ii < iil; ii++) { if ($field[i] == arr[ii].field) { fieldInTotal = true; _fieldData.push(_format(arr[ii].data)); break; } } ; if (!lev) { newData.push(_fieldData); } ; } ; } return newData; } ; /* * 获取某一行数据,当前dataFrame.data中 */ function _getRowDataAt(index) { var o = {}; var data = dataFrame.data; for (var a = 0; a < data.length; a++) { o[data[a].field] = data[a].data[index]; } ; return o; } /** * obj => {uv: 100, pv: 10 ...} */ function _getRowDataOf(obj) { !obj && (obj = {}); var arr = []; var expCount = 0; for (var p in obj) { expCount++; } ; if (expCount) { var _loop = function _loop(i) { var matchNum = 0; _canvax._.each(dataFrame.data, function (fd) { if (fd.field in obj && fd.data[i] == obj[fd.field]) { matchNum++; } }); if (matchNum == expCount) { //说明这条数据是完全和查询 arr.push(_getRowDataAt(i)); } ; }; for (var i = dataFrame.range.start; i <= dataFrame.range.end; i++) { _loop(i); } ; } ; return arr; } function _getFieldData(field) { var list = []; var _f = _canvax._.find(dataFrame.data, function (obj) { return obj.field == field; }); _f && (list = _f.data); return list; } _init(dataOrg); dataFrame.data = _getDataAndSetDataLen(); return dataFrame; }