createListFromArray.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. var _config = require("../../config");
  2. var __DEV__ = _config.__DEV__;
  3. var zrUtil = require("zrender/lib/core/util");
  4. var List = require("../../data/List");
  5. var completeDimensions = require("../../data/helper/completeDimensions");
  6. var _model = require("../../util/model");
  7. var getDataItemValue = _model.getDataItemValue;
  8. var converDataValue = _model.converDataValue;
  9. var isDataItemOption = _model.isDataItemOption;
  10. var CoordinateSystem = require("../../CoordinateSystem");
  11. function firstDataNotNull(data) {
  12. var i = 0;
  13. while (i < data.length && data[i] == null) {
  14. i++;
  15. }
  16. return data[i];
  17. }
  18. function ifNeedCompleteOrdinalData(data) {
  19. var sampleItem = firstDataNotNull(data);
  20. return sampleItem != null && !zrUtil.isArray(getDataItemValue(sampleItem));
  21. }
  22. /**
  23. * Helper function to create a list from option data
  24. */
  25. function createListFromArray(data, seriesModel, ecModel) {
  26. // If data is undefined
  27. data = data || [];
  28. var coordSysName = seriesModel.get('coordinateSystem');
  29. var creator = creators[coordSysName];
  30. var registeredCoordSys = CoordinateSystem.get(coordSysName);
  31. var completeDimOpt = {
  32. encodeDef: seriesModel.get('encode'),
  33. dimsDef: seriesModel.get('dimensions')
  34. }; // FIXME
  35. var axesInfo = creator && creator(data, seriesModel, ecModel, completeDimOpt);
  36. var dimensions = axesInfo && axesInfo.dimensions;
  37. if (!dimensions) {
  38. // Get dimensions from registered coordinate system
  39. dimensions = registeredCoordSys && (registeredCoordSys.getDimensionsInfo ? registeredCoordSys.getDimensionsInfo() : registeredCoordSys.dimensions.slice()) || ['x', 'y'];
  40. dimensions = completeDimensions(dimensions, data, completeDimOpt);
  41. }
  42. var categoryIndex = axesInfo ? axesInfo.categoryIndex : -1;
  43. var list = new List(dimensions, seriesModel);
  44. var nameList = createNameList(axesInfo, data);
  45. var categories = {};
  46. var dimValueGetter = categoryIndex >= 0 && ifNeedCompleteOrdinalData(data) ? function (itemOpt, dimName, dataIndex, dimIndex) {
  47. // If any dataItem is like { value: 10 }
  48. if (isDataItemOption(itemOpt)) {
  49. list.hasItemOption = true;
  50. } // Use dataIndex as ordinal value in categoryAxis
  51. return dimIndex === categoryIndex ? dataIndex : converDataValue(getDataItemValue(itemOpt), dimensions[dimIndex]);
  52. } : function (itemOpt, dimName, dataIndex, dimIndex) {
  53. var value = getDataItemValue(itemOpt);
  54. var val = converDataValue(value && value[dimIndex], dimensions[dimIndex]); // If any dataItem is like { value: 10 }
  55. if (isDataItemOption(itemOpt)) {
  56. list.hasItemOption = true;
  57. }
  58. var categoryAxesModels = axesInfo && axesInfo.categoryAxesModels;
  59. if (categoryAxesModels && categoryAxesModels[dimName]) {
  60. // If given value is a category string
  61. if (typeof val === 'string') {
  62. // Lazy get categories
  63. categories[dimName] = categories[dimName] || categoryAxesModels[dimName].getCategories();
  64. val = zrUtil.indexOf(categories[dimName], val);
  65. if (val < 0 && !isNaN(val)) {
  66. // In case some one write '1', '2' istead of 1, 2
  67. val = +val;
  68. }
  69. }
  70. }
  71. return val;
  72. };
  73. list.hasItemOption = false;
  74. list.initData(data, nameList, dimValueGetter);
  75. return list;
  76. }
  77. function isStackable(axisType) {
  78. return axisType !== 'category' && axisType !== 'time';
  79. }
  80. function getDimTypeByAxis(axisType) {
  81. return axisType === 'category' ? 'ordinal' : axisType === 'time' ? 'time' : 'float';
  82. }
  83. /**
  84. * Creaters for each coord system.
  85. */
  86. var creators = {
  87. cartesian2d: function (data, seriesModel, ecModel, completeDimOpt) {
  88. var axesModels = zrUtil.map(['xAxis', 'yAxis'], function (name) {
  89. return ecModel.queryComponents({
  90. mainType: name,
  91. index: seriesModel.get(name + 'Index'),
  92. id: seriesModel.get(name + 'Id')
  93. })[0];
  94. });
  95. var xAxisModel = axesModels[0];
  96. var yAxisModel = axesModels[1];
  97. var xAxisType = xAxisModel.get('type');
  98. var yAxisType = yAxisModel.get('type');
  99. var dimensions = [{
  100. name: 'x',
  101. type: getDimTypeByAxis(xAxisType),
  102. stackable: isStackable(xAxisType)
  103. }, {
  104. name: 'y',
  105. // If two category axes
  106. type: getDimTypeByAxis(yAxisType),
  107. stackable: isStackable(yAxisType)
  108. }];
  109. var isXAxisCateogry = xAxisType === 'category';
  110. var isYAxisCategory = yAxisType === 'category';
  111. dimensions = completeDimensions(dimensions, data, completeDimOpt);
  112. var categoryAxesModels = {};
  113. if (isXAxisCateogry) {
  114. categoryAxesModels.x = xAxisModel;
  115. }
  116. if (isYAxisCategory) {
  117. categoryAxesModels.y = yAxisModel;
  118. }
  119. return {
  120. dimensions: dimensions,
  121. categoryIndex: isXAxisCateogry ? 0 : isYAxisCategory ? 1 : -1,
  122. categoryAxesModels: categoryAxesModels
  123. };
  124. },
  125. singleAxis: function (data, seriesModel, ecModel, completeDimOpt) {
  126. var singleAxisModel = ecModel.queryComponents({
  127. mainType: 'singleAxis',
  128. index: seriesModel.get('singleAxisIndex'),
  129. id: seriesModel.get('singleAxisId')
  130. })[0];
  131. var singleAxisType = singleAxisModel.get('type');
  132. var isCategory = singleAxisType === 'category';
  133. var dimensions = [{
  134. name: 'single',
  135. type: getDimTypeByAxis(singleAxisType),
  136. stackable: isStackable(singleAxisType)
  137. }];
  138. dimensions = completeDimensions(dimensions, data, completeDimOpt);
  139. var categoryAxesModels = {};
  140. if (isCategory) {
  141. categoryAxesModels.single = singleAxisModel;
  142. }
  143. return {
  144. dimensions: dimensions,
  145. categoryIndex: isCategory ? 0 : -1,
  146. categoryAxesModels: categoryAxesModels
  147. };
  148. },
  149. polar: function (data, seriesModel, ecModel, completeDimOpt) {
  150. var polarModel = ecModel.queryComponents({
  151. mainType: 'polar',
  152. index: seriesModel.get('polarIndex'),
  153. id: seriesModel.get('polarId')
  154. })[0];
  155. var angleAxisModel = polarModel.findAxisModel('angleAxis');
  156. var radiusAxisModel = polarModel.findAxisModel('radiusAxis');
  157. var radiusAxisType = radiusAxisModel.get('type');
  158. var angleAxisType = angleAxisModel.get('type');
  159. var dimensions = [{
  160. name: 'radius',
  161. type: getDimTypeByAxis(radiusAxisType),
  162. stackable: isStackable(radiusAxisType)
  163. }, {
  164. name: 'angle',
  165. type: getDimTypeByAxis(angleAxisType),
  166. stackable: isStackable(angleAxisType)
  167. }];
  168. var isAngleAxisCateogry = angleAxisType === 'category';
  169. var isRadiusAxisCateogry = radiusAxisType === 'category';
  170. dimensions = completeDimensions(dimensions, data, completeDimOpt);
  171. var categoryAxesModels = {};
  172. if (isRadiusAxisCateogry) {
  173. categoryAxesModels.radius = radiusAxisModel;
  174. }
  175. if (isAngleAxisCateogry) {
  176. categoryAxesModels.angle = angleAxisModel;
  177. }
  178. return {
  179. dimensions: dimensions,
  180. categoryIndex: isAngleAxisCateogry ? 1 : isRadiusAxisCateogry ? 0 : -1,
  181. categoryAxesModels: categoryAxesModels
  182. };
  183. },
  184. geo: function (data, seriesModel, ecModel, completeDimOpt) {
  185. // TODO Region
  186. // 多个散点图系列在同一个地区的时候
  187. return {
  188. dimensions: completeDimensions([{
  189. name: 'lng'
  190. }, {
  191. name: 'lat'
  192. }], data, completeDimOpt)
  193. };
  194. }
  195. };
  196. function createNameList(result, data) {
  197. var nameList = [];
  198. var categoryDim = result && result.dimensions[result.categoryIndex];
  199. var categoryAxisModel;
  200. if (categoryDim) {
  201. categoryAxisModel = result.categoryAxesModels[categoryDim.name];
  202. }
  203. if (categoryAxisModel) {
  204. // FIXME Two category axis
  205. var categories = categoryAxisModel.getCategories();
  206. if (categories) {
  207. var dataLen = data.length; // Ordered data is given explicitly like
  208. // [[3, 0.2], [1, 0.3], [2, 0.15]]
  209. // or given scatter data,
  210. // pick the category
  211. if (zrUtil.isArray(data[0]) && data[0].length > 1) {
  212. nameList = [];
  213. for (var i = 0; i < dataLen; i++) {
  214. nameList[i] = categories[data[i][result.categoryIndex || 0]];
  215. }
  216. } else {
  217. nameList = categories.slice(0);
  218. }
  219. }
  220. }
  221. return nameList;
  222. }
  223. var _default = createListFromArray;
  224. module.exports = _default;