ascor
Version:
一些常用的简单的js工具
68 lines (67 loc) • 2.5 kB
JavaScript
import { isArray, isObject } from "../is/index";
/**
* 根据返回的数组创建树接口
* @param arr
* @param config,例:{ parentKey: "pid", ownKey: "id" } ,parentKey为父节点唯一标识的字段名,例如pid,ownKey为自己的唯一表示,如id
* @return 返回创建好的树
*/
export const createTree = (arr, config) => {
if (!isArray(arr)) {
return arr;
}
let _config = Object.assign({ parentKey: "pid", ownKey: "id", sortFn: (a, b) => {
if (a.isLeaf && !b.isLeaf) {
return 1;
}
if (!a.isLeaf && b.isLeaf) {
return -1;
}
return 0;
} }, (isObject(config) ? config : {}));
const id = _config.ownKey;
const pid = _config.parentKey;
let index = 0;
let tmp = arr.map(m => {
return Object.assign(Object.assign({}, m), { children: [], isLeaf: true });
}), f = (data, flag) => {
var _a, _b;
if (isArray(data)) {
for (let k = 0; k < data.length; k++) {
if (tmp[index][pid] == data[k][id]) {
if (!data[k].children
.map((m) => {
return m[id];
})
.includes(tmp[index][id])) {
(_b = (_a = data === null || data === void 0 ? void 0 : data[k]) === null || _a === void 0 ? void 0 : _a.children) === null || _b === void 0 ? void 0 : _b.push(tmp.splice(index, 1)[0]);
data[k].isLeaf = false;
index--;
}
break;
}
else if (tmp[index][id] == data[k][pid]) {
if (!tmp[index].children
.map((m) => {
return m[id];
})
.includes(tmp[index][id])) {
tmp[index].children.push(data.splice(k, 1)[0]);
tmp[index].isLeaf = false;
if (!flag) {
index--;
}
}
break;
}
else {
f(data[k].children, true);
}
}
data.sort(_config === null || _config === void 0 ? void 0 : _config.sortFn);
}
};
for (index = 0; index < tmp.length; index++) {
f(tmp);
}
return tmp;
};