UNPKG

@ant-design/pro-utils

Version:
146 lines (141 loc) 6.89 kB
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray"; import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2"; import _typeof from "@babel/runtime/helpers/esm/typeof"; import deepMerge from 'lodash-es/merge'; import get from "rc-util/es/utils/get"; import namePathSet from "rc-util/es/utils/set"; import React from 'react'; import { isNil } from "../isNil"; import { merge } from "../merge"; /** * 暂时还不支持 Set和 Map 结构 判断是不是一个能遍历的对象 * * @param itemValue * @returns Boolean */ export function isPlainObj(itemValue) { if (_typeof(itemValue) !== 'object') return false; /** Null 也要处理,不然omit空会失效 */ if (itemValue === null) return true; if ( /*#__PURE__*/React.isValidElement(itemValue)) return false; if (itemValue.constructor === RegExp) return false; if (itemValue instanceof Map) return false; if (itemValue instanceof Set) return false; if (itemValue instanceof HTMLElement) return false; if (itemValue instanceof Blob) return false; if (itemValue instanceof File) return false; if (Array.isArray(itemValue)) return false; return true; } export var transformKeySubmitValue = function transformKeySubmitValue(values, dataFormatMapRaw) { var omit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; // ignore nil transform var dataFormatMap = Object.keys(dataFormatMapRaw).reduce(function (ret, key) { var value = dataFormatMapRaw[key]; if (!isNil(value)) { // eslint-disable-next-line no-param-reassign ret[key] = value; // can't be undefined } return ret; }, {}); if (Object.keys(dataFormatMap).length < 1) { return values; } if (typeof window === 'undefined') return values; // 如果 value 是 string | null | Array | Blob类型 其中之一,直接返回 // 形如 {key: [File, File]} 的表单字段当进行第二次递归时会导致其直接越过 typeof value !== 'object' 这一判断 https://github.com/ant-design/pro-components/issues/2071 if (_typeof(values) !== 'object' || isNil(values) || values instanceof Blob) { return values; } var finalValues = Array.isArray(values) ? [] : {}; var gen = function gen(tempValues, parentsKey) { var isArrayValues = Array.isArray(tempValues); var result = isArrayValues ? [] : {}; if (tempValues == null || tempValues === undefined) { return result; } Object.keys(tempValues).forEach(function (entityKey) { var transformForArray = function transformForArray(transformList, subItemValue) { if (!Array.isArray(transformList)) return entityKey; transformList.forEach(function (transform, idx) { // 如果不存在直接返回 if (!transform) return; var subTransformItem = subItemValue === null || subItemValue === void 0 ? void 0 : subItemValue[idx]; // 如果是个方法,把key设置为方法的返回值 if (typeof transform === 'function') { subItemValue[idx] = transform(subItemValue, entityKey, tempValues); } if (_typeof(transform) === 'object' && !Array.isArray(transform)) { Object.keys(transform).forEach(function (transformArrayItem) { var subTransformItemValue = subTransformItem === null || subTransformItem === void 0 ? void 0 : subTransformItem[transformArrayItem]; if (typeof transform[transformArrayItem] === 'function' && subTransformItemValue) { var res = transform[transformArrayItem](subTransformItem[transformArrayItem], entityKey, tempValues); subTransformItem[transformArrayItem] = _typeof(res) === 'object' ? res[transformArrayItem] : res; } else if (_typeof(transform[transformArrayItem]) === 'object' && Array.isArray(transform[transformArrayItem]) && subTransformItemValue) { transformForArray(transform[transformArrayItem], subTransformItemValue); } }); } if (_typeof(transform) === 'object' && Array.isArray(transform) && subTransformItem) { transformForArray(transform, subTransformItem); } }); return entityKey; }; var key = parentsKey ? [parentsKey, entityKey].flat(1) : [entityKey].flat(1); var itemValue = tempValues[entityKey]; var transformFunction = get(dataFormatMap, key); var transform = function transform() { var tempKey, transformedResult, isTransformedResultPrimitive = false; /** * 先判断是否是方法,是的话执行后拿到值,如果是基本类型,则认为是直接 transform 为新的值, * 如果返回是 Object 则认为是 transform 为新的 {newKey: newValue} */ if (typeof transformFunction === 'function') { transformedResult = transformFunction === null || transformFunction === void 0 ? void 0 : transformFunction(itemValue, entityKey, tempValues); var typeOfResult = _typeof(transformedResult); if (typeOfResult !== 'object' && typeOfResult !== 'undefined') { tempKey = entityKey; isTransformedResultPrimitive = true; } else { tempKey = transformedResult; } } else { tempKey = transformForArray(transformFunction, itemValue); } // { [key:string]:any } 数组也能通过编译 if (Array.isArray(tempKey)) { result = namePathSet(result, tempKey, itemValue); return; } if (_typeof(tempKey) === 'object' && !Array.isArray(finalValues)) { finalValues = deepMerge(finalValues, tempKey); } else if (_typeof(tempKey) === 'object' && Array.isArray(finalValues)) { result = _objectSpread(_objectSpread({}, result), tempKey); } else if (tempKey !== null || tempKey !== undefined) { result = namePathSet(result, [tempKey], isTransformedResultPrimitive ? transformedResult : itemValue); } }; /** 如果存在转化器提前渲染一下 */ if (transformFunction && typeof transformFunction === 'function') { transform(); } if (typeof window === 'undefined') return; if (isPlainObj(itemValue)) { var genValues = gen(itemValue, key); if (Object.keys(genValues).length < 1) { return; } result = namePathSet(result, [entityKey], genValues); return; } transform(); }); // namePath、transform在omit为false时需正常返回 https://github.com/ant-design/pro-components/issues/2901#issue-908097115 return omit ? result : tempValues; }; finalValues = Array.isArray(values) && Array.isArray(finalValues) ? _toConsumableArray(gen(values)) : merge({}, gen(values), finalValues); return finalValues; };