UNPKG

3.48 kBJavaScriptView Raw
1import { getTickMethod } from '../../deps/f2-scale/src';
2import { getRange, isArray } from '@antv/util';
3import { toTimeStamp } from '../../util';
4// 判断新老values是否相等,这里只要判断前后是否相等即可
5function isValuesEqual(values, newValues) {
6 if (values.length !== newValues.length) {
7 return false;
8 }
9 var lastIndex = values.length - 1;
10 return values[0] === newValues[0] && values[lastIndex] === newValues[lastIndex];
11}
12function updateCategoryRange(scale, originScale, range) {
13 var currentValues = scale.values,
14 currentTicks = scale.ticks,
15 tickMethod = scale.tickMethod,
16 tickCount = scale.tickCount;
17 var originValues = originScale.values;
18 var start = range[0],
19 end = range[1];
20 var len = originValues.length;
21 var valueStart = start * len;
22 var valueEnd = end * len;
23 // 保持滑动时个数的稳定
24 var diff = valueEnd - valueStart;
25 var precision = parseFloat(diff.toFixed(3)); // js 计算精度问题
26 var count = Math.round(precision);
27 var sliceSatrt = Math.min(Math.round(valueStart), len - count);
28 // 从原始数据里截取需要显示的数据
29 var newValues = originValues.slice(sliceSatrt, sliceSatrt + count);
30 // 根据当前数据的比例,和定义的tickCount计算应该需要多少个ticks
31 var newTickCount = Math.round(tickCount * originValues.length / newValues.length);
32 // 计算新的ticks
33 var catTicks = getTickMethod(tickMethod);
34 var newTicks = catTicks({
35 tickCount: newTickCount,
36 values: originValues
37 });
38 // 如果新数组和当前显示的数组相同,则不更新
39 if (isValuesEqual(currentValues, newValues) && isValuesEqual(currentTicks, newTicks)) {
40 return;
41 }
42 scale.change({
43 values: newValues,
44 ticks: newTicks
45 });
46 return scale;
47}
48function updateLinearRange(scale, originScale, range) {
49 var min = originScale.min,
50 max = originScale.max;
51 var start = range[0],
52 end = range[1];
53 var newMin = min + (max - min) * start;
54 var newMax = min + (max - min) * end;
55 scale.change({
56 min: newMin,
57 max: newMax,
58 nice: false
59 });
60}
61function updateScale(scale, values) {
62 var isLinear = scale.isLinear;
63 if (isLinear) {
64 var _a = getRange(values),
65 min = _a.min,
66 max = _a.max;
67 return scale.change({
68 min: min,
69 max: max,
70 nice: true
71 });
72 }
73}
74function updateRange(scale, originScale, range) {
75 var isCategory = scale.isCategory,
76 isLinear = scale.isLinear;
77 if (isCategory) {
78 return updateCategoryRange(scale, originScale, range);
79 }
80 if (isLinear) {
81 return updateLinearRange(scale, originScale, range);
82 }
83}
84function updateFollow(scales, mainScale, data) {
85 var mainField = mainScale.field,
86 mainType = mainScale.type,
87 mainValues = mainScale.values;
88 // 转成 map 提高查询性能
89 var mainValuesMap = {};
90 mainValues.forEach(function (item) {
91 mainValuesMap[item] = true;
92 });
93 return scales.map(function (scale) {
94 var followField = scale.field;
95 var values = [];
96 data.forEach(function (item) {
97 var value = mainType === 'timeCat' ? toTimeStamp(item[mainField]) : item[mainField];
98 if (mainValuesMap[value]) {
99 var followItemValue = item[followField];
100 if (isArray(followItemValue)) {
101 values.push.apply(values, followItemValue);
102 } else {
103 values.push(followItemValue);
104 }
105 }
106 });
107 return updateScale(scale, values);
108 });
109}
110export { updateRange, updateFollow };
\No newline at end of file