项目中遇到一个需求,循环显示表单例如input radio之类的,表单的值要根据返回数据配置的路径放在指定位置。
例如:
{
name:'用户姓名',
type:'input',
valPath:'a.b.c'
}
就是显示出用户姓名的input,input的value要放到a对象下的b对象下的c,且a对象初始化值可能是空。
下面是设置函数
var setVal = function (obj, value, ...keys) {
keys.reduce((acc, cur, i) => {
// acc 上一次return的结果 cur这一次当前遍历的值 i当前遍历的索引
// eslint-disable-next-line no-return-assign
return (acc[cur] = i === keys.length - 1 ? value : acc[cur] || {})
// 根据递归创建空对象,直到是最后一个属性并赋值
}, obj)
// 最后这个obj是需要递归的初始值,即第一次递归的acc和cur等于obj
}
//使用示例
var obj = {};
var valPath = 'a.b.c'
setVal(obj ,1, ...valPath.split('.'))
console.log(obj.a.b.c) // 1
类似问题:根据对象路径获取对象下的value