UNPKG

web-common-util

Version:
279 lines (220 loc) 8.61 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _defineProperty = require('@babel/runtime/helpers/defineProperty'); var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties'); var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty); var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties); var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_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__default['default'](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__default['default'](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__default['default'](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__default['default'](_ref, ["children"]); return rest; }); } // eslint-disable-next-line @typescript-eslint/no-unused-vars return result.map(function (_ref2) { var children = _ref2.children, rest = _objectWithoutProperties__default['default'](_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__default['default'](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)); } exports.findAncestors = findAncestors; exports.findChildren = findChildren; exports.findLeavesFromTree = findLeavesFromTree; exports.getPathFromTree = getPathFromTree; exports.treeFromArray = treeFromArray; exports.treeToArray = treeToArray;