sizeUtil.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.autoPtgSizes = autoPtgSizes;
  7. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  8. function autoPtgSizes(ptgSizes, minPtgSizes, maxPtgSizes) {
  9. // Static current data
  10. let currentTotalPtg = 0;
  11. const undefinedIndexes = [];
  12. ptgSizes.forEach((size, index) => {
  13. if (size === undefined) {
  14. undefinedIndexes.push(index);
  15. } else {
  16. currentTotalPtg += size;
  17. }
  18. });
  19. const restPtg = 1 - currentTotalPtg;
  20. const undefinedCount = undefinedIndexes.length;
  21. // Fill if exceed
  22. if (restPtg < 0) {
  23. const scale = 1 / currentTotalPtg;
  24. return ptgSizes.map(size => size === undefined ? 0 : size * scale);
  25. }
  26. // Check if limit exists
  27. let sumMin = 0;
  28. let sumMax = 0;
  29. let limitMin = 0;
  30. let limitMax = 1;
  31. for (const index of undefinedIndexes) {
  32. const min = minPtgSizes[index] || 0;
  33. const max = maxPtgSizes[index] || 1;
  34. sumMin += min;
  35. sumMax += max;
  36. limitMin = Math.max(limitMin, min);
  37. limitMax = Math.min(limitMax, max);
  38. }
  39. // Impossible case, just average fill
  40. if (sumMin > 1 && sumMax < 1) {
  41. const avg = 1 / undefinedCount;
  42. return ptgSizes.map(size => size === undefined ? avg : size);
  43. }
  44. // Quickly fill if can
  45. const restAvg = restPtg / undefinedCount;
  46. if (limitMin <= restAvg && restAvg <= limitMax) {
  47. return ptgSizes.map(size => size === undefined ? restAvg : size);
  48. }
  49. // Greedy algorithm
  50. const result = (0, _toConsumableArray2.default)(ptgSizes);
  51. let remain = restPtg - sumMin;
  52. for (let i = 0; i < undefinedCount; i += 1) {
  53. const index = undefinedIndexes[i];
  54. const min = minPtgSizes[index] || 0;
  55. const max = maxPtgSizes[index] || 1;
  56. result[index] = min;
  57. const canAdd = max - min;
  58. const add = Math.min(canAdd, remain);
  59. result[index] += add;
  60. remain -= add;
  61. }
  62. return result;
  63. }