通常情况下使用框架也好, 类库也好, 在处理表单提交时, 可能需要对参数做些处理, 比如原本为数组转换为字符串逗号分隔
需求代码
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 的方法, 不应该使用 switchswitch (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 值
