通常情况下使用框架也好, 类库也好, 在处理表单提交时, 可能需要对参数做些处理, 比如原本为数组转换为字符串逗号分隔
需求代码
const params = {
name: 'name',
age: 10,
list: [1, 2, 3, 4, 5]
};
// 最终结果需要是 { name: 'name', age: 10, list: '1,2,3,4,5'}
解决方法
方案一
使用 JSON.stringify 的过滤方案
function formatParams(params) {
const newParams = JSON.stringify(params, (key, val) => {
// 此处可以判断 key 值批量处理, 当然应该使用 if else 的方法, 不应该使用 switch
switch (true) {
case (key === 'list' && Array.isArray(val)):
return val.join(',');
default:
return val;
}
});
return JSON.parse(newParams);
}
方案二
使用 Object.keys + Array.prototype.reduce 做循环
function formatParams(params) {
return Object.keys(params).reduce((a, b) => {
if (b === 'list' && Array.isArray(params[b])) {
a[b] = params[b].join(',');
return a;
}
a[b] = params[b];
return a;
}, {});
}
方案三
使用 for in 遍历对象
function formatParams(params) {
let newParams = {};
for (const key in params) {
if (key === 'list' && Array.isArray(params[key])) {
newParams[key] = params[key].join(',');
break;
}
newParams[key] = params[key];
}
return newParams;
}
方案四
直接利用对象 key 的唯一性进行覆盖, 最简单直接
function formatParams(params) {
return {
...params,
list: Array.isArray(params.list) ? params.list.join(',') : params.list,
}
}
其他方案
待研究
总结
当然每种方法都有利有弊, 使用循环的做法效率比较低, 但可以批量执行, 直接转换的方案效率比较高, 但必须要明确知道要转换的 key 值