最近在项目中遇到一个问题,用户在搜索框搜索时会出现将搜索内容复制过来进行搜索的情况,这样内容的开头或者结尾就容易带上空格,造成后端搜索不到指定内容,最直接的解决方法就是在vue的input 组件中使用 v-model.trim,但是由于页面太多,如果逐一修改则会耗费大量时间,后来想到在调用接口前统一将数据进行处理,遍历数据中的每一项,将是字符串的数据进行处理,代码如下:
// 遍历请求参数中所有开头/结尾有空格的字段,并去除
toTrim (data) {
if (data === null) return null;
else if (typeof data === 'string') return data.trim();
else if (data !== null && typeof data === 'object') {
let newObj = data instanceof Array ? [] : {};
for (let key in data) {
newObj[key] = this.toTrim(data[key]);
}
return newObj;
} else return data;
}
这样就能将所有前后带空字符串的数据处理
但是后来发现一个问题,并非所有的数据对象都是普通对象,还有date 和 formdata 等对象,这样就造成了上传及带日期的请求失败.
接下来的重点就是区分普通对象和其他特殊对象了
// 判断是否是formdata对象
let isFormData = (v) => {
return Object.prototype.toString.call(v) === '[object FormData]';
}
console.log(isFormData(new FormData()));
相应的,判断是否是普通的Object
let isObject = (v) => {
return Object.prototype.toString.call(v) === '[object Object]';
}
console.log(isObject({}));
将代码修改如下:
// 遍历请求参数中所有开头/结尾有空格的字段,并去除
toTrim (data) {
if (data === null) return null;
else if (typeof data === 'string') return data.trim();
else if (data !== null && typeof data === 'object') {
if (Object.prototype.toString.call(data) === '[object Object]') {
let newObj = data instanceof Array ? [] : {};
for (let key in data) {
newObj[key] = this.toTrim(data[key]);
}
return newObj;
}
return data;
} else return data;
}