123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- const each = require('@antv/util/lib/each');
- const maxBy = require('@antv/util/lib/math/max-by');
- const isArray = require('@antv/util/lib/type/is-array');
- const ArrayUtil = {
- merge: require('@antv/util/lib/array/merge')
- };
- const Adjust = require('./base');
- class Symmetric extends Adjust {
- _initDefaultCfg() {
- this.xField = null; // 调整对应的 x 方向对应的字段名称
- this.yField = null; // 调整对应的 y 方向对应的字段名称
- this.cacheMax = null; // 缓存的最大值
- this.adjustNames = [ 'y' ]; // Only support stack y
- this.groupFields = null; // 参与分组的数据维度
- }
- // 获取最大的y值
- _getMax(dim) {
- const self = this;
- const mergeData = self.mergeData;
- const maxRecord = maxBy(mergeData, obj => {
- const value = obj[dim];
- if (isArray(value)) {
- return Math.max.apply(null, value);
- }
- return value;
- });
- const maxValue = maxRecord[dim];
- const max = isArray(maxValue) ? Math.max.apply(null, maxValue) : maxValue;
- return max;
- }
- // 获取每个字段最大的值
- _getXValuesMax() {
- const self = this;
- const yField = self.yField;
- const xField = self.xField;
- const cache = {};
- const mergeData = self.mergeData;
- each(mergeData, function(obj) {
- const xValue = obj[xField];
- const yValue = obj[yField];
- const max = isArray(yValue) ? Math.max.apply(null, yValue) : yValue;
- cache[xValue] = cache[xValue] || 0;
- if (cache[xValue] < max) {
- cache[xValue] = max;
- }
- });
- return cache;
- }
- // 入口函数
- processAdjust(dataArray) {
- const self = this;
- const mergeData = ArrayUtil.merge(dataArray);
- self.mergeData = mergeData;
- self._processSymmetric(dataArray);
- self.mergeData = null;
- }
- // 处理对称
- _processSymmetric(dataArray) {
- const self = this;
- const xField = self.xField;
- const yField = self.yField;
- const max = self._getMax(yField);
- const first = dataArray[0][0];
- let cache;
- if (first && isArray(first[yField])) {
- cache = self._getXValuesMax();
- }
- each(dataArray, function(data) {
- each(data, function(obj) {
- const value = obj[yField];
- let offset;
- if (isArray(value)) {
- const xValue = obj[xField];
- const valueMax = cache[xValue];
- offset = (max - valueMax) / 2;
- const tmp = [];
- /* eslint-disable no-loop-func */
- each(value, function(subVal) { // 多个字段
- tmp.push(offset + subVal);
- });
- /* eslint-enable no-loop-func */
- obj[yField] = tmp;
- } else {
- offset = (max - value) / 2;
- obj[yField] = [ offset, value + offset ];
- }
- });
- });
- }
- }
- Adjust.Symmetric = Symmetric;
- module.exports = Symmetric;
|