@tmagic/utils 1.8.0-beta.11 → 1.8.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.8.0-beta.11",
2
+ "version": "1.8.0-beta.13",
3
3
  "name": "@tmagic/utils",
4
4
  "type": "module",
5
5
  "sideEffects": false,
@@ -35,7 +35,7 @@
35
35
  },
36
36
  "peerDependencies": {
37
37
  "typescript": "^6.0.3",
38
- "@tmagic/schema": "1.8.0-beta.11"
38
+ "@tmagic/schema": "1.8.0-beta.13"
39
39
  },
40
40
  "peerDependenciesMeta": {
41
41
  "typescript": {
package/src/index.ts CHANGED
@@ -17,7 +17,7 @@
17
17
  * limitations under the License.
18
18
  */
19
19
 
20
- import { cloneDeep, set as objectSet } from 'lodash-es';
20
+ import { cloneDeep, get as objectGet, set as objectSet } from 'lodash-es';
21
21
 
22
22
  import type {
23
23
  DataSchema,
@@ -308,6 +308,13 @@ export const getKeysArray = (keys: string | number) =>
308
308
  // 将 array[0] 转成 array.0
309
309
  `${keys}`.replace(/\[(\d+)\]/g, '.$1').split('.');
310
310
 
311
+ /**
312
+ * 判断某一层 key 是否为数组下标(纯数字)
313
+ * @param key 单层 key
314
+ * @returns 是否为数组下标
315
+ */
316
+ export const isArrayIndex = (key: string | number): boolean => /^\d+$/.test(`${key}`);
317
+
311
318
  export const getValueByKeyPath = (
312
319
  keys: number | string | string[] = '',
313
320
  data: Record<string | number, any> = {},
@@ -327,8 +334,23 @@ export const getValueByKeyPath = (
327
334
  }, data);
328
335
  };
329
336
 
330
- export const setValueByKeyPath = (keys: string | number, value: any, data: Record<string | number, any> = {}): any =>
331
- objectSet(data, keys, value);
337
+ export const setValueByKeyPath = (keys: string | number, value: any, data: Record<string | number, any> = {}): any => {
338
+ if (typeof value === 'undefined') {
339
+ // 仅数组下标场景需要特殊处理:lodash 的 set 会把 undefined 写入数组得到 [undefined],
340
+ // 此处改为只创建父级空数组,避免出现 [undefined]。对象属性场景 undefined 会被 JSON 自然丢弃,保持原行为。
341
+ // 注意:这里将「数字型末级 key」统一按数组下标处理,无法区分数字型对象 key,属于预期内的取舍。
342
+ const keyArray = getKeysArray(keys);
343
+ const lastKey = keyArray[keyArray.length - 1];
344
+ if (keyArray.length > 1 && isArrayIndex(lastKey)) {
345
+ const parentPath = keyArray.slice(0, -1).join('.');
346
+ if (typeof objectGet(data, parentPath) === 'undefined') {
347
+ objectSet(data, parentPath, []);
348
+ }
349
+ return data;
350
+ }
351
+ }
352
+ return objectSet(data, keys, value);
353
+ };
332
354
 
333
355
  export const getNodes = (ids: Id[], data: MNode[] = []): MNode[] => {
334
356
  const nodes: MNode[] = [];
package/types/index.d.ts CHANGED
@@ -87,6 +87,12 @@ declare const isSameDomain: (targetUrl?: string, source?: string) => boolean;
87
87
  */
88
88
  declare const guid: (digit?: number) => string;
89
89
  declare const getKeysArray: (keys: string | number) => string[];
90
+ /**
91
+ * 判断某一层 key 是否为数组下标(纯数字)
92
+ * @param key 单层 key
93
+ * @returns 是否为数组下标
94
+ */
95
+ declare const isArrayIndex: (key: string | number) => boolean;
90
96
  declare const getValueByKeyPath: (keys?: number | string | string[], data?: Record<string | number, any>) => any;
91
97
  declare const setValueByKeyPath: (keys: string | number, value: any, data?: Record<string | number, any>) => any;
92
98
  declare const getNodes: (ids: Id[], data?: MNode[]) => MNode[];
@@ -126,4 +132,4 @@ declare const traverseNode: <T extends NodeItem = NodeItem>(node: T, cb: (node:
126
132
  declare const isValueIncludeDataSource: (value: any) => boolean;
127
133
  declare const removeDataSourceFieldPrefix: (id?: string) => string;
128
134
  //#endregion
129
- export { DATA_SOURCE_FIELDS_CHANGE_EVENT_PREFIX, DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX, DATA_SOURCE_SET_DATA_METHOD_NAME, DSL_NODE_KEY_COPY_PREFIX, IS_DSL_NODE_KEY, NodeItem, PAGE_FRAGMENT_CONTAINER_ID_KEY, addClassName, addParamToUrl, asyncLoadCss, asyncLoadJs, calcValueByFontsize, calculatePercentage, compiledCond, compiledNode, convertToNumber, createDiv, dataSourceTemplateRegExp, delQueStr, emptyFn, filterXSS, getDefaultValueFromFields, getDepKeys, getDepNodeIds, getDocument, getElById, getGlobalThis, getHost, getIdFromEl, getKeys, getKeysArray, getNodeInfo, getNodePath, getNodes, getSearchObj, getUrlParam, getValueByKeyPath, guid, injectStyle, isDslNode, isNumber, isObject, isPage, isPageFragment, isPercentage, isPop, isSameDomain, isValueIncludeDataSource, removeClassName, removeClassNameByClassName, removeDataSourceFieldPrefix, replaceChildNode, setDslDomRelateConfig, setIdToEl, setUrlParam, setValueByKeyPath, sleep, toHump, toLine, traverseNode };
135
+ export { DATA_SOURCE_FIELDS_CHANGE_EVENT_PREFIX, DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX, DATA_SOURCE_SET_DATA_METHOD_NAME, DSL_NODE_KEY_COPY_PREFIX, IS_DSL_NODE_KEY, NodeItem, PAGE_FRAGMENT_CONTAINER_ID_KEY, addClassName, addParamToUrl, asyncLoadCss, asyncLoadJs, calcValueByFontsize, calculatePercentage, compiledCond, compiledNode, convertToNumber, createDiv, dataSourceTemplateRegExp, delQueStr, emptyFn, filterXSS, getDefaultValueFromFields, getDepKeys, getDepNodeIds, getDocument, getElById, getGlobalThis, getHost, getIdFromEl, getKeys, getKeysArray, getNodeInfo, getNodePath, getNodes, getSearchObj, getUrlParam, getValueByKeyPath, guid, injectStyle, isArrayIndex, isDslNode, isNumber, isObject, isPage, isPageFragment, isPercentage, isPop, isSameDomain, isValueIncludeDataSource, removeClassName, removeClassNameByClassName, removeDataSourceFieldPrefix, replaceChildNode, setDslDomRelateConfig, setIdToEl, setUrlParam, setValueByKeyPath, sleep, toHump, toLine, traverseNode };