array_utils.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /**
  2. * DevExtreme (data/array_utils.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var _type = require("../core/utils/type");
  11. var _config = require("../core/config");
  12. var _config2 = _interopRequireDefault(_config);
  13. var _guid = require("../core/guid");
  14. var _guid2 = _interopRequireDefault(_guid);
  15. var _extend = require("../core/utils/extend");
  16. var _errors = require("./errors");
  17. var _object = require("../core/utils/object");
  18. var _object2 = _interopRequireDefault(_object);
  19. var _utils = require("./utils");
  20. function _interopRequireDefault(obj) {
  21. return obj && obj.__esModule ? obj : {
  22. "default": obj
  23. }
  24. }
  25. function _typeof(obj) {
  26. "@babel/helpers - typeof";
  27. return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
  28. return typeof obj
  29. } : function(obj) {
  30. return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj
  31. }, _typeof(obj)
  32. }
  33. function hasKey(target, keyOrKeys) {
  34. var keys = "string" === typeof keyOrKeys ? keyOrKeys.split() : keyOrKeys.slice();
  35. while (keys.length) {
  36. var key = keys.shift();
  37. if (key in target) {
  38. return true
  39. }
  40. }
  41. return false
  42. }
  43. function findItems(keyInfo, items, key, groupCount) {
  44. if (groupCount) {
  45. for (var i = 0; i < items.length; i++) {
  46. var childItems = items[i].items || items[i].collapsedItems || [];
  47. var result = findItems(keyInfo, childItems || [], key, groupCount - 1);
  48. if (result) {
  49. return result
  50. }
  51. }
  52. } else {
  53. if (indexByKey(keyInfo, items, key) >= 0) {
  54. return items
  55. }
  56. }
  57. }
  58. function getItems(keyInfo, items, key, groupCount) {
  59. if (groupCount) {
  60. return findItems(keyInfo, items, key, groupCount) || []
  61. }
  62. return items
  63. }
  64. function generateDataByKeyMap(keyInfo, array) {
  65. if (keyInfo.key() && !array._dataByKeyMap) {
  66. var dataByKeyMap = {};
  67. for (var i = 0, arrayLength = array.length; i < arrayLength; i++) {
  68. dataByKeyMap[JSON.stringify(keyInfo.keyOf(array[i]))] = array[i]
  69. }
  70. array._dataByKeyMap = dataByKeyMap
  71. }
  72. }
  73. function getCacheValue(array, key) {
  74. if (array._dataByKeyMap) {
  75. return array._dataByKeyMap[JSON.stringify(key)]
  76. }
  77. }
  78. function getHasKeyCacheValue(array, key) {
  79. if (array._dataByKeyMap) {
  80. return array._dataByKeyMap[JSON.stringify(key)]
  81. }
  82. return true
  83. }
  84. function setDataByKeyMapValue(array, key, data) {
  85. if (array._dataByKeyMap) {
  86. array._dataByKeyMap[JSON.stringify(key)] = data
  87. }
  88. }
  89. function applyBatch(keyInfo, array, batchData, groupCount, useInsertIndex) {
  90. batchData.forEach(function(item) {
  91. var items = "insert" === item.type ? array : getItems(keyInfo, array, item.key, groupCount);
  92. generateDataByKeyMap(keyInfo, items);
  93. switch (item.type) {
  94. case "update":
  95. update(keyInfo, items, item.key, item.data, true);
  96. break;
  97. case "insert":
  98. insert(keyInfo, items, item.data, useInsertIndex && (0, _type.isDefined)(item.index) ? item.index : -1, true);
  99. break;
  100. case "remove":
  101. remove(keyInfo, items, item.key, true)
  102. }
  103. })
  104. }
  105. function update(keyInfo, array, key, data, isBatch) {
  106. var target;
  107. var extendComplexObject = true;
  108. var keyExpr = keyInfo.key();
  109. if (keyExpr) {
  110. if (hasKey(data, keyExpr) && !(0, _utils.keysEqual)(keyExpr, key, keyInfo.keyOf(data))) {
  111. return !isBatch && (0, _utils.rejectedPromise)(_errors.errors.Error("E4017"))
  112. }
  113. target = getCacheValue(array, key);
  114. if (!target) {
  115. var index = indexByKey(keyInfo, array, key);
  116. if (index < 0) {
  117. return !isBatch && (0, _utils.rejectedPromise)(_errors.errors.Error("E4009"))
  118. }
  119. target = array[index]
  120. }
  121. } else {
  122. target = key
  123. }
  124. _object2.default.deepExtendArraySafe(target, data, extendComplexObject);
  125. if (!isBatch) {
  126. if ((0, _config2.default)().useLegacyStoreResult) {
  127. return (0, _utils.trivialPromise)(key, data)
  128. } else {
  129. return (0, _utils.trivialPromise)(target, key)
  130. }
  131. }
  132. }
  133. function insert(keyInfo, array, data, index, isBatch) {
  134. var keyValue;
  135. var keyExpr = keyInfo.key();
  136. var obj = (0, _type.isPlainObject)(data) ? (0, _extend.extend)({}, data) : data;
  137. if (keyExpr) {
  138. keyValue = keyInfo.keyOf(obj);
  139. if (void 0 === keyValue || "object" === _typeof(keyValue) && (0, _type.isEmptyObject)(keyValue)) {
  140. if (Array.isArray(keyExpr)) {
  141. throw _errors.errors.Error("E4007")
  142. }
  143. keyValue = obj[keyExpr] = String(new _guid2.default)
  144. } else {
  145. if (void 0 !== array[indexByKey(keyInfo, array, keyValue)]) {
  146. return !isBatch && (0, _utils.rejectedPromise)(_errors.errors.Error("E4008"))
  147. }
  148. }
  149. } else {
  150. keyValue = obj
  151. }
  152. if (index >= 0) {
  153. array.splice(index, 0, obj)
  154. } else {
  155. array.push(obj)
  156. }
  157. setDataByKeyMapValue(array, keyValue, obj);
  158. if (!isBatch) {
  159. return (0, _utils.trivialPromise)((0, _config2.default)().useLegacyStoreResult ? data : obj, keyValue)
  160. }
  161. }
  162. function remove(keyInfo, array, key, isBatch) {
  163. var index = indexByKey(keyInfo, array, key);
  164. if (index > -1) {
  165. array.splice(index, 1)
  166. }
  167. if (!isBatch) {
  168. return (0, _utils.trivialPromise)(key)
  169. }
  170. }
  171. function indexByKey(keyInfo, array, key) {
  172. var keyExpr = keyInfo.key();
  173. if (!getHasKeyCacheValue(array, key)) {
  174. return -1
  175. }
  176. for (var i = 0, arrayLength = array.length; i < arrayLength; i++) {
  177. if ((0, _utils.keysEqual)(keyExpr, keyInfo.keyOf(array[i]), key)) {
  178. return i
  179. }
  180. }
  181. return -1
  182. }
  183. module.exports.applyBatch = applyBatch;
  184. module.exports.update = update;
  185. module.exports.insert = insert;
  186. module.exports.remove = remove;
  187. module.exports.indexByKey = indexByKey;