cat.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /**
  2. * @fileOverview 计算分类的的坐标点
  3. * @author dxq613@gmail.com
  4. */
  5. var each = require('@antv/util/lib/each');
  6. var MAX_COUNT = 8;
  7. var SUB_COUNT = 4; // 控制个数不能过小
  8. function getSimpleArray(data) {
  9. var arr = [];
  10. each(data, function (sub) {
  11. arr = arr.concat(sub);
  12. });
  13. return arr;
  14. }
  15. function getGreatestFactor(count, number) {
  16. var i;
  17. for (i = number; i > 0; i--) {
  18. if (count % i === 0) {
  19. break;
  20. }
  21. } // 如果是素数,没有可以整除的数字
  22. if (i === 1) {
  23. for (i = number; i > 0; i--) {
  24. if ((count - 1) % i === 0) {
  25. break;
  26. }
  27. }
  28. }
  29. return i;
  30. }
  31. module.exports = function (info) {
  32. var rst = {};
  33. var ticks = [];
  34. var isRounding = info.isRounding;
  35. var categories = getSimpleArray(info.data);
  36. var length = categories.length;
  37. var maxCount = info.maxCount || MAX_COUNT;
  38. var tickCount;
  39. if (isRounding) {
  40. // 取整操作
  41. tickCount = getGreatestFactor(length - 1, maxCount - 1) + 1; // 如果计算出来只有两个坐标点,则直接使用传入的 maxCount
  42. if (tickCount === 2) {
  43. tickCount = maxCount;
  44. } else if (tickCount < maxCount - SUB_COUNT) {
  45. tickCount = maxCount - SUB_COUNT;
  46. }
  47. } else {
  48. tickCount = maxCount;
  49. }
  50. if (!isRounding && length <= tickCount + tickCount / 2) {
  51. ticks = [].concat(categories);
  52. } else {
  53. var step = parseInt(length / (tickCount - 1), 10);
  54. var groups = categories.map(function (e, i) {
  55. return i % step === 0 ? categories.slice(i, i + step) : null;
  56. }).filter(function (e) {
  57. return e;
  58. });
  59. for (var i = 1, groupLen = groups.length; i < groupLen && (isRounding ? i * step < length - step : i < tickCount - 1); i++) {
  60. ticks.push(groups[i][0]);
  61. }
  62. if (categories.length) {
  63. ticks.unshift(categories[0]);
  64. var last = categories[length - 1];
  65. if (ticks.indexOf(last) === -1) {
  66. ticks.push(last);
  67. }
  68. }
  69. }
  70. rst.categories = categories;
  71. rst.ticks = ticks;
  72. return rst;
  73. };