Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

vor 3 Jahren
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import _extends from 'babel-runtime/helpers/extends';
  2. export var STATUS_ADD = 'add';
  3. export var STATUS_KEEP = 'keep';
  4. export var STATUS_REMOVE = 'remove';
  5. export var STATUS_REMOVED = 'removed';
  6. export function wrapKeyToObject(key) {
  7. var keyObj = void 0;
  8. if (key && typeof key === 'object' && 'key' in key) {
  9. keyObj = key;
  10. } else {
  11. keyObj = { key: key };
  12. }
  13. return _extends({}, keyObj, {
  14. key: String(keyObj.key)
  15. });
  16. }
  17. export function parseKeys() {
  18. var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  19. return keys.map(wrapKeyToObject);
  20. }
  21. export function diffKeys() {
  22. var prevKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  23. var currentKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  24. var list = [];
  25. var currentIndex = 0;
  26. var currentLen = currentKeys.length;
  27. var prevKeyObjects = parseKeys(prevKeys);
  28. var currentKeyObjects = parseKeys(currentKeys);
  29. // Check prev keys to insert or keep
  30. prevKeyObjects.forEach(function (keyObj) {
  31. var hit = false;
  32. for (var i = currentIndex; i < currentLen; i += 1) {
  33. var currentKeyObj = currentKeyObjects[i];
  34. if (currentKeyObj.key === keyObj.key) {
  35. // New added keys should add before current key
  36. if (currentIndex < i) {
  37. list = list.concat(currentKeyObjects.slice(currentIndex, i).map(function (obj) {
  38. return _extends({}, obj, { status: STATUS_ADD });
  39. }));
  40. currentIndex = i;
  41. }
  42. list.push(_extends({}, currentKeyObj, {
  43. status: STATUS_KEEP
  44. }));
  45. currentIndex += 1;
  46. hit = true;
  47. break;
  48. }
  49. }
  50. // If not hit, it means key is removed
  51. if (!hit) {
  52. list.push(_extends({}, keyObj, {
  53. status: STATUS_REMOVE
  54. }));
  55. }
  56. });
  57. // Add rest to the list
  58. if (currentIndex < currentLen) {
  59. list = list.concat(currentKeyObjects.slice(currentIndex).map(function (obj) {
  60. return _extends({}, obj, { status: STATUS_ADD });
  61. }));
  62. }
  63. /**
  64. * Merge same key when it remove and add again:
  65. * [1 - add, 2 - keep, 1 - remove] -> [1 - keep, 2 - keep]
  66. */
  67. var keys = {};
  68. list.forEach(function (_ref) {
  69. var key = _ref.key;
  70. keys[key] = (keys[key] || 0) + 1;
  71. });
  72. var duplicatedKeys = Object.keys(keys).filter(function (key) {
  73. return keys[key] > 1;
  74. });
  75. duplicatedKeys.forEach(function (matchKey) {
  76. // Remove `STATUS_REMOVE` node.
  77. list = list.filter(function (_ref2) {
  78. var key = _ref2.key,
  79. status = _ref2.status;
  80. return key !== matchKey || status !== STATUS_REMOVE;
  81. });
  82. // Update `STATUS_ADD` to `STATUS_KEEP`
  83. list.forEach(function (node) {
  84. if (node.key === matchKey) {
  85. node.status = STATUS_KEEP;
  86. }
  87. });
  88. });
  89. return list;
  90. }