import { forEach, isArray, isPlainObject } from 'ut2';
/**
* 创建一个转换值的新对象或数组。
*
* 例如 antd Form 中的设置表单值时,如果值为空字符串可能需要转为 `undefined` ,才不影响表单的初始值。
*
* @alias module:Processor.transformObjectValue
* @since 4.23.0
* @param {Array | Object} data 要转换值的普通对象或数组
* @param {Function} fn 遍历普通对象或数组键值方法
* @param {boolean} [deep=true] 深度遍历,检测值为普通对象或数组时递归处理。默认`true`
* @returns {Array | Object} 如果是普通对象或数组,返回一个新的对象或数组,否则返回自身
* @example
*
* const data1 = { foo: 'bar', baz: 42 }
* // 数字转为字符串
* transformObjectValue(data1, value => {
* if(typeof value === 'number'){
* return String(value)
* }
* return value;
* });
* // { foo: 'bar', baz: '42' }
*
* const data2 = [1,2,3,4];
* // 数字转为字符串
* transformObjectValue(data2, value=>{
* if(typeof value === 'number'){
* return String(value)
* }
* });
* // ['1', '2', '3', '4']
*
* // 嵌套普通对象或数组
* const data3 = { foo: 'bar', baz: 42, c: [1,2,3,4], d: '' }
* // 数字转为字符串,空字符串转为undefined
* transformObjectValue(data3, value=>{
* if(typeof value === 'number'){
* return String(value);
* }
* retrun value === '' ? undefined : value
* });
* // { foo: 'bar', baz: '42', ['1', '2', '3', '4'], d: undefined }
*
* // 数组的值不处理,对象值为数字转为字符串,空字符串转为undefined
* transformObjectValue(data3, (value, key)=>{
* if(typeof key === 'number'){
* return value;
* }
* if(typeof value === 'number'){
* return String(value);
* }
* retrun value === '' ? undefined : value
* });
* // { foo: 'bar', baz: '42', [1, 2, 3, 4], d: undefined }
*
*/
const transformObjectValue = function (data, fn, deep = true) {
if (isPlainObject(data)) {
const result = {};
forEach(data, (value, key) => {
const newValue = deep && (isPlainObject(value) || isArray(value)) ? transformObjectValue(value, fn) : fn(value, key);
result[key] = newValue;
});
return result;
}
else if (isArray(data)) {
const result = [];
forEach(data, (value, index) => {
const newValue = deep && (isPlainObject(value) || isArray(value)) ? transformObjectValue(value, fn) : fn(value, index);
result.push(newValue);
});
return result;
}
return data;
};
export default transformObjectValue;