解决办法:使用bigInt处理long类型数据
// 自定义比较函数
const compareBigInt = (a, b) => {
return a < b ? -1 : a > b ? 1 : 0;
};
export function minBigInt(bigIntArr: any) {
// 使用自定义比较函数找到最小值
const min = bigIntArr.reduce((min, current) => {
return compareBigInt(current, min) < 0 ? current : min;
}, bigIntArr[0]);
return min;
}
/**
* 构造树型结构数据
* @param {*} data 数据源
* @param {*} id id字段 默认 'id'
* @param {*} parentId 父节点字段 默认 'parentId'
* @param {*} rootId 根Id 默认 0
*/
export function handleTree(data: any, id = 'id', parentId = 'parentId', rootId?: any): any {
// 后端传来的longInt类型这里有问题,会出现精度丢失的问题
// rootId = (
// rootId ||
// // eslint-disable-next-line prefer-spread
// Math.min.apply(
// Math,
// data.map((item: any) => {
// return item[parentId];
// }),
// ) ||
// 0
// ).toString();
const bigIntArr = data.map((item: any) => {
return BigInt(item[parentId]);
});
const min = minBigInt(bigIntArr);
rootId = (rootId || min || 0).toString();
// console.log('min', rootId);
//对源数据深度克隆
const cloneData = JSON.parse(JSON.stringify(data));
//循环所有项
const treeData = cloneData.filter((father) => {
const branchArr = cloneData.filter((child) => {
//返回每一项的子级数组
return father[id] === child[parentId];
});
branchArr.length > 0 ? (father.children = branchArr) : '';
//返回第一层
return father[parentId] === rootId;
});
return treeData != '' ? treeData : data;
// return treeData
}