使用计算属性名称来创建内部对象

时间:2018-02-21 17:03:04

标签: javascript ecmascript-6

如果我创建一个像

这样的对象
const name = "email";

form = {[name]: "jon@doe.com"}

我的form对象看起来像这样

{email: "jon@doe.com"}

是否可以设置name ,我的结果将会是

{
  info: {
    email: "jon@doe.com"
  }
}

我试过了:

const name = "info.email";

form = {[name]: "jon@doe.com"}

但生成的form对象如下所示:

{info.email: "jon@doe.com"}

我也尝试过:

const name = "info[email]";

form = {[name]: "jon@doe.com"}

但生成的form对象如下所示:

{info[email]: "jon@doe.com"}

2 个答案:

答案 0 :(得分:2)

此代码将解决您的问题。



const createObject = (jsonPath, value) => {
  const keys = jsonPath.split('.')
  let keyValue = value;
  while(keys.length) {
    let obj = {};
    obj[keys.pop()] = keyValue;
    keyValue = Object.assign({}, obj);
  }
  return JSON.stringify(keyValue);
}

console.log(createObject('info.person.name', 'john doe'));




答案 1 :(得分:2)

@Dude你不能直接这样做

因为Object会将键作为字符串,无论你传递什么,都会将其指定为键

所以如果你试试

const name = "info.email"; form = {[name]: "jon@doe.com"} 它将“info.email”作为键并将值赋给该键。

如果你想在字符串有点“的情况下创建一个内部对象。”

你可以编写一个将字符串键转换为内部对象的函数。

    const createObject = (jsonPath, delimiter='.') => {
        const innerKeys = jsonPath.split(delimiter);
        const key = innerKeys.splice(0,1);
        if(innerKeys.length>0){
             return {[key]:createObject(innerKeys.join(delimiter), delimiter)}
        }else{
          return key[0];
        }   
   }
console.log(createObject('info.name.vishnu')); //{"info":{"name":"vishnu"}}
console.log(createObject('info,name,vishnu'), ','); //{"info":{"name":"vishnu"}}