dictUtil.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.calcRangeKeys = calcRangeKeys;
  6. exports.convertDirectoryKeysToNodes = convertDirectoryKeysToNodes;
  7. var Record;
  8. (function (Record) {
  9. Record[Record["None"] = 0] = "None";
  10. Record[Record["Start"] = 1] = "Start";
  11. Record[Record["End"] = 2] = "End";
  12. })(Record || (Record = {}));
  13. function traverseNodesKey(treeData, fieldNames, callback) {
  14. function processNode(dataNode) {
  15. const key = dataNode[fieldNames.key];
  16. const children = dataNode[fieldNames.children];
  17. if (callback(key, dataNode) !== false) {
  18. traverseNodesKey(children || [], fieldNames, callback);
  19. }
  20. }
  21. treeData.forEach(processNode);
  22. }
  23. /** 计算选中范围,只考虑expanded情况以优化性能 */
  24. function calcRangeKeys(_ref) {
  25. let {
  26. treeData,
  27. expandedKeys,
  28. startKey,
  29. endKey,
  30. fieldNames = {
  31. title: 'title',
  32. key: 'key',
  33. children: 'children'
  34. }
  35. } = _ref;
  36. const keys = [];
  37. let record = Record.None;
  38. if (startKey && startKey === endKey) {
  39. return [startKey];
  40. }
  41. if (!startKey || !endKey) {
  42. return [];
  43. }
  44. function matchKey(key) {
  45. return key === startKey || key === endKey;
  46. }
  47. traverseNodesKey(treeData, fieldNames, key => {
  48. if (record === Record.End) {
  49. return false;
  50. }
  51. if (matchKey(key)) {
  52. // Match test
  53. keys.push(key);
  54. if (record === Record.None) {
  55. record = Record.Start;
  56. } else if (record === Record.Start) {
  57. record = Record.End;
  58. return false;
  59. }
  60. } else if (record === Record.Start) {
  61. // Append selection
  62. keys.push(key);
  63. }
  64. return expandedKeys.includes(key);
  65. });
  66. return keys;
  67. }
  68. function convertDirectoryKeysToNodes(treeData, keys, fieldNames) {
  69. const restKeys = [...keys];
  70. const nodes = [];
  71. traverseNodesKey(treeData, fieldNames, (key, node) => {
  72. const index = restKeys.indexOf(key);
  73. if (index !== -1) {
  74. nodes.push(node);
  75. restKeys.splice(index, 1);
  76. }
  77. return !!restKeys.length;
  78. });
  79. return nodes;
  80. }