@antv/g2plot
Version:
An interactive and responsive charting library
67 lines (63 loc) • 1.62 kB
text/typescript
import { get, isNumber, isObject, isUndefined, reduce } from '@antv/util';
import { Options } from '../../types';
import { LEVEL, log } from '../../utils';
import { ABSOLUTE_FIELD, DIFF_FIELD, IS_TOTAL, Y_FIELD } from './constant';
/**
* @desc 数据处理函数,统一将数据处理成[start, end]
* @param data
* @param xField
* @param yField
* @param totalLabel
*/
export function processData(
data: Options['data'],
xField: string,
yField: string,
newYField: string,
total?: false | { label?: string }
) {
const newData = [];
reduce(
data,
(r, d) => {
// 校验数据合法性
log(LEVEL.WARN, isNumber(d[yField]), `${d[yField]} is not a valid number`);
const value = isUndefined(d[yField]) ? null : d[yField];
newData.push({ ...d, [newYField]: [r, r + value] });
return r + value;
},
0
);
// 如果需要展示总和
if (newData.length && total) {
const sum = get(newData, [[data.length - 1], newYField, [1]]);
newData.push({
[xField]: total.label,
[yField]: sum,
[newYField]: [0, sum],
});
}
return newData;
}
/**
* 处理为 瀑布图 数据
*/
export function transformData(
data: Options['data'],
xField: string,
yField: string,
total?: false | { label?: string }
) {
const processed = processData(data, xField, yField, Y_FIELD, total);
return processed.map((d, dIdx) => {
if (!isObject(d)) {
return d;
}
return {
...d,
[ABSOLUTE_FIELD]: d[Y_FIELD][1],
[DIFF_FIELD]: d[Y_FIELD][1] - d[Y_FIELD][0],
[IS_TOTAL]: dIdx === data.length,
};
});
}