写这个API的目的是因为:如果前端传一个对象数据给后端(如obj: {a: ''}),后端会把空字符串也当做值(而非null)作为查询条件,因此常常会无法搜到想要的结果(始终觉得后端这问题应该很容易解决,但始终没解决),因此还是打算抽个时间封装个可以自动转换空字符串或undefined的API。这个API 可以对数据、对象混合的机构数据做做处理,不限数据层级。
函数相关封装代码:
//获取数据类型
const dataType = data => {
return Object.prototype.toString.call(data)
}
// 空字符串转null
const toNUll = v => {
let res = '';
let str = dataType(v) === "[object Undefined]" ? null : v.replace(/\s+/g, '');
return res = str == '' ? null : str;
}
// 对于数据项是数组情况做处理
const array = d =>{
let fun = value => {
value.length && value.forEach(v => {
if("[object Object]" === dataType(v)){
emptyCharToNull(v)
}else if("[object Array]" === dataType(v)){
fun(v)
}
})
}
fun(d)
}
// 对于空字符串转成null
const emptyCharToNull = v => {
let type = dataType(v);
// 如果是对象或字符串的情况下
if("[object Object]" === type){
Object.keys(v).forEach(key => {
let item = v[key];
let itemType = dataType(item);
if("[object String]" === itemType || "[object Undefined]" === itemType){
v[key] = toNUll(item)
}else if("[object Object]" === itemType){
emptyCharToNull(v[key])
}else if("[object Array]" === itemType){
array(v[key])
}
})
}else if("[object Array]" === type){ // 如果是数组的情况下
array(v)
}
}
// 排除空数据并转成 用于条件搜索 或 数据提交
export const excludeEmptyToNull = target => {
let type = dataType(target);
if("[object String]" === type || "[object Undefined]" === type){
return toNUll(target)
}
emptyCharToNull(target)
return target
}
模拟数据
let mockData = {
test: [
'a',
{
b: '1',
c: {
d: 2,
e: '',
ee: [
{
eee: ''
}
]
},
f: ' 11 22',
g: '',
h: undefined,
i: [
'k',
{
kk: '123',
kkk: ''
}
]
}
],
gg: ''
}
运行结果