@zhsz/cool-design-dv
Version:
99 lines (98 loc) • 3.36 kB
JavaScript
import { isObject } from "lodash-es";
function createSource(standardColumns = [], rows = [], settings = {}) {
const headerRow = standardColumns.map((col) => col.displayName || col.name);
const source = headerRow.length ? [headerRow] : [];
const indexes = getNeedTransformColumnIndexes(standardColumns);
const dataRows = [];
rows.forEach((row) => {
const newRow = Array.isArray(row) ? row : standardColumns.map((col) => {
return row[col.name];
});
transformData(standardColumns, indexes, newRow);
dataRows.push(newRow);
});
const sortColumnIndex = standardColumns.findIndex((col) => !!col.sort);
if (sortColumnIndex >= 0) {
const col = standardColumns[sortColumnIndex];
const dir = settings.direction;
const sortType = typeof col.sort === "string" ? col.sort : dir === "x" ? "asc" : "desc";
dataRows.sort((first, second) => {
return sortType === "asc" ? second[sortColumnIndex] - first[sortColumnIndex] : first[sortColumnIndex] - second[sortColumnIndex];
});
}
return source.concat(dataRows);
}
function getNeedTransformColumnIndexes(standardColumns) {
const indexes = [];
standardColumns.forEach((col, index) => {
if (col.unit || col.precision >= 0) {
indexes.push(index);
}
});
return indexes;
}
function transformData(standardColumns, indexes, row) {
indexes.forEach((index) => {
const column = standardColumns[index];
let value = row[index];
const unit = column.unit || "n";
const precision = column.precision || 0;
switch (unit.toLowerCase()) {
case "k":
value = value / 1e3;
break;
case "w":
value = value / 1e4;
break;
case "p":
value = value * 100;
break;
}
row[index] = formatValue(value, precision);
});
}
function formatValue(value, precision) {
return Number.parseFloat(value.toFixed(precision));
}
function createDimensions(layout, standardColumns, source) {
return layout === "column" ? standardColumns : source.map((row) => row[0]);
}
function getLimitRows(standardColumns, rows, limit) {
if (!limit || rows.length <= limit || !standardColumns[1]) {
return rows;
}
const valueColumn = standardColumns[1];
const columnName = valueColumn.name;
rows.sort((first, second) => {
const firstValue = Array.isArray(first) ? first[1] : first[columnName];
const secondValue = Array.isArray(second) ? second[1] : second[columnName];
return secondValue - firstValue;
});
const otherTotal = rows.filter((n, index) => index >= limit).reduce((total, item) => {
return total + (Array.isArray(item) ? item[1] : item[columnName]);
}, 0);
const other = ["其他", otherTotal];
const limitRows = rows.slice(0, limit);
limitRows.push(other);
return limitRows;
}
function columnsToStandard({ columns = [] }) {
return columns.map((col) => {
return isObject(col) ? col : { name: col };
});
}
function createDataset(standardColumns, { id, rows, layout = "column", header }, settings) {
const limitRows = getLimitRows(standardColumns, rows, settings.limit);
const source = createSource(standardColumns, limitRows, settings);
const dimensions = createDimensions(layout, standardColumns, source);
return {
id,
dimensions,
source,
sourceHeader: header
};
}
export {
columnsToStandard,
createDataset
};