stack.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. const isArray = require('@antv/util/lib/type/is-array');
  2. const isNil = require('@antv/util/lib/type/is-nil');
  3. const Adjust = require('./base');
  4. class Stack extends Adjust {
  5. _initDefaultCfg() {
  6. this.xField = null; // 调整对应的 x 方向对应的字段名称
  7. this.yField = null; // 调整对应的 y 方向对应的字段名称
  8. }
  9. processAdjust(dataArray) {
  10. this.processStack(dataArray);
  11. }
  12. processStack(dataArray) {
  13. const self = this;
  14. const xField = self.xField;
  15. const yField = self.yField;
  16. const count = dataArray.length;
  17. const stackCache = {
  18. positive: {},
  19. negative: {}
  20. };
  21. // 层叠顺序翻转
  22. if (self.reverseOrder) {
  23. dataArray = dataArray.slice(0).reverse();
  24. }
  25. for (let i = 0; i < count; i++) {
  26. const data = dataArray[i];
  27. for (let j = 0, len = data.length; j < len; j++) {
  28. const item = data[j];
  29. const x = item[xField] || 0;
  30. let y = item[yField];
  31. const xkey = x.toString();
  32. y = isArray(y) ? y[1] : y;
  33. if (!isNil(y)) {
  34. const direction = y >= 0 ? 'positive' : 'negative';
  35. if (!stackCache[direction][xkey]) {
  36. stackCache[direction][xkey] = 0;
  37. }
  38. item[yField] = [ stackCache[direction][xkey], y + stackCache[direction][xkey] ];
  39. stackCache[direction][xkey] += y;
  40. }
  41. }
  42. }
  43. }
  44. }
  45. Adjust.Stack = Stack;
  46. module.exports = Stack;