js对象根据属性名表达式解析成新的对象

如今有一个对象

var obj = {
  "name": "zhansan",
  "age": 21,
  "parent.name": "lisi",
  "parent.age": 44,
  "girlfriend[0].name": "fanbinbin",
  "girlfriend[0].age": "32",
  "girlfriend[1].name": "gaoyuanyuan",
  "girlfriend[1].age": "32"
}

需实现一个函数 magic ,使magic(obj)结果如下,求解

var obj = {
  "name": "zhansan",
  "age": 21,
  parent: {
    name: "lisi",
    age: 44,
  },
  girlfriend: [
    {name: "fanbinbin", age: 32},
    {name: "gaoyuanyuan", age: 32},
  ]
}


问题引入

在使用react  ant-design做项目的过程中

使用getFiledValues()获取表单所用控件的值时

对于相同的id元素只能拿到一个值

<input id="name"/>

<input id="name"/>

通常通过拼接后缀的方式,提交到后台处理

<input id="name1"/>

<input id="name2"/>

上面方式虽然能达到目的,但总觉得不妥,代码冗余,不易维护

或许可以直接写入表达式,通过某种方式来解析后直接提交给后台

<input id="name[0]"/>

<input id="name[1]"/>


贴上代码,后续再补上注释

function magic(obj) {
  const result = {}, reg = /^(\w+)(?:[`'"]?\[(\w+)\][`'"]?|\.)?((?:\w+|[`'"]?\[\w+\][`'"]?|\.)+)?$/;
  const match = function (key) {
    let group = reg.exec(key)
    if (group) {
      return group
    }
    throw new Error("表达式不正确 " + key)
  }
  const isNum = function (n) {
    return /^\d+$/.test(n)
  }

  function fn(obj, rt) {
    for (let k in obj) {
      let [a,b,c,d] = match(k), v = obj[k];
      if (c && d) {
        fn({[c + d]: v}, rt[b] = rt[b] || (isNum(c) ? [] : {}))
      } else if (c) {
        rt[b] = rt[b] || (isNum(c) ? [] : {})
        rt[b][c] = v
      } else if (d) {
        fn({[d]: v}, rt[b] = rt[b] || {})
      } else {
        rt[b] = v
      }
    }
  }

  fn(obj, result)

  return result;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值