web-common-util
Version:
264 lines (209 loc) • 7.88 kB
JavaScript
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
/**
* treeFromArray 时间复杂度(treeFromArray):O(n)
* @param {array} arr
* @param {object} opt
*/
function treeFromArray(arr, option) {
var opt = _objectSpread({
hasParent: function hasParent(item) {
return item.parentId;
},
lostError: true
}, option);
var temp = arr.map(function (n) {
return _objectSpread(_objectSpread({}, n), {}, {
children: undefined
});
});
var groupsByParent = {};
var itemsMap = {};
var itemRecordHasChirdren = {};
var itemsNoParent = [];
var itemsLost = {}; // 遍历所有节点,找出对应关系
for (var i = 0; i < temp.length; i++) {
var item = temp[i];
var hasParent = opt.hasParent(item);
var parentId = item.parentId;
var id = item.id;
if (!itemsMap[id]) {
itemsMap[id] = item;
}
if (hasParent) {
if (!groupsByParent[parentId]) {
groupsByParent[parentId] = [];
itemsLost[parentId] = true;
}
groupsByParent[parentId].push(item); // 先遍历到了父节点,现在找到了子节点,建立关系
var parent = itemsMap[parentId];
if (parent) {
if (!parent.children) {
parent.children = groupsByParent[parentId];
itemsLost[parentId] = false;
}
} else {
itemRecordHasChirdren[parentId] = true;
}
} else {
itemsNoParent.push(item);
} // 先遍历到了子节点,现在找到了父节点,建立关系
if (itemRecordHasChirdren[id]) {
if (!item.children) {
item.children = groupsByParent[id];
itemsLost[id] = false;
}
}
} // 缺项抛出错误
if (opt.lostError) {
var ids = Object.keys(itemsLost).filter(function (k) {
return itemsLost[k];
});
if (ids.length) {
throw new Error("Can't find items:[".concat(ids.join(','), "]"));
}
} // 返回根节点元素
return itemsNoParent;
}
function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var defaultTreeToArrayOpt = {
onlyLeavesReturn: false
};
function treeToArray(arr) {
var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultTreeToArrayOpt;
var result = _toConsumableArray(arr);
var _loop = function _loop(i) {
var current = result[i];
var children = current.children;
if (Array.isArray(children)) {
result = result.concat(children.map(function (n) {
return _objectSpread$1(_objectSpread$1({}, n), {}, {
parentId: current.id
});
}));
}
};
for (var i = 0; i < result.length; i++) {
_loop(i);
}
if (option.onlyLeavesReturn) {
return result.filter(function (n) {
var children = n.children;
return !children || Array.isArray(children) && children.length === 0;
}) // eslint-disable-next-line @typescript-eslint/no-unused-vars
.map(function (_ref) {
var children = _ref.children,
rest = _objectWithoutProperties(_ref, ["children"]);
return rest;
});
} // eslint-disable-next-line @typescript-eslint/no-unused-vars
return result.map(function (_ref2) {
var children = _ref2.children,
rest = _objectWithoutProperties(_ref2, ["children"]);
return rest;
});
} // const bb = treeToArray([{ id: '3', test: 3, children: [{ id: '5' }] }]);
/**
* findLeavesFromTree
* @param {array} arr
*/
var findLeavesFromTree = function findLeavesFromTree(arr) {
return treeToArray(arr, {
onlyLeavesReturn: true
});
};
/**
* findChildren
* @param {array} arr
* @param {string | number} id
* @param {object} option
*/
function findChildren(arr, id) {
var option = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
recursion: true
};
var duplicate = _toConsumableArray(arr);
var child = arr.find(function (n) {
return n.id === id;
});
if (!child) {
return [];
}
var result = [child];
for (var i = 0; i < (option.recursion ? result.length : 1); i++) {
var current = result[i];
for (var j = 0; j < duplicate.length; j++) {
var item = duplicate[j];
if (item.parentId === current.id) {
result.push(duplicate.splice(j, 1)[0]);
j--;
}
} // result=arr.filter(n=>n)
}
result.shift();
return result;
}
/**
* findChildren
* @param {array} arr
* @param {string | number} id
* @param {object} option
*/
function findAncestors(arr, id) {
var option = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
resultIncludeSelf: true
};
var resultIncludeSelf = option.resultIncludeSelf;
var dataMap = {};
arr.forEach(function (n) {
dataMap[n.id] = n;
});
var current = dataMap[id];
if (!current) {
return [];
}
var result = resultIncludeSelf ? current ? [current] : [] : [];
for (var i = 0; i <= result.length; i++) {
var item = i === 0 ? current : result[i];
var parent = dataMap[item.parentId];
if (parent) {
result.push(parent);
continue;
}
break;
}
return result;
}
function getPathFromTree(arr, id) {
var queue = arr.map(function (n, i) {
return {
item: n,
path: "".concat(i)
};
});
while (queue.length) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
var current = queue.shift();
var children = current.item.children,
path = current.path;
if (current.item.id === id && path) {
return path.split('-').map(function (v) {
return Number(v);
});
}
if (Array.isArray(children) && children.length) {
for (var i = 0; i < children.length; i++) {
queue.push({
item: children[i],
path: "".concat(path ? path + '-' : '').concat(i)
});
}
}
}
throw new Error("Can not get path of ".concat(id));
}
export { findAncestors, findChildren, findLeavesFromTree, getPathFromTree, treeFromArray, treeToArray };