最优雅的方式来创建一个JSON对象

Sri*_*har 2 javascript json

我有一个看起来像这样的javacript对象.

val = 
{
default: "version1"
version1: "abc.com"
version2: "def.com"
...
versionn:"xyz.com"
}
Run Code Online (Sandbox Code Playgroud)

我想将它转换为这样的嵌套json

"newval": {
"website": {
    "url": "abc.com"
},
"versions": {
    "version1": {
        "website": {
            "url": "abc.com"
        }
    },
    "version2": {
        "website": {
            "url": "def.com"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}

如果if语句和不必要的变量,我的版本会使用很多.有没有一种优雅的方式来转换/创建这个JSON.

即默认版本是newval.website下的版本,所有版本数据都是fir newval.website.versions

lla*_*ama 8

设置.website属性非常简单.只需要查找default持有的密钥即可.

另一部分可以通过过滤掉default密钥,然后将其余部分映射到使用分配给结果的新对象列表来完成Object.assign.

var val =  {
default: "version1",
version1: "abc.com",
version2: "def.com",
version3:"xyz.com"
};

var res = {
  website: {url: val[val.default]},
  versions: Object.assign(
    ...Object.keys(val)
             .filter(k => k !== "default")
             .map(k => ({[k]: {website: {url: val[k]} } }))
)};

console.log(res);
Run Code Online (Sandbox Code Playgroud)


这是避免需要的另一种方式.filter().它假设您不介意default在原始对象上进行不可枚举.

var val =  {
default: "version1",
version1: "abc.com",
version2: "def.com",
version3:"xyz.com"
};

var res = {
  website: {url: val[Object.defineProperty(val, "default", {enumerable:false}).default]},
  versions: Object.assign(
    ...Object.keys(val).map(k => ({[k]: {website: {url: val[k]} } }))
)};

console.log(res);
Run Code Online (Sandbox Code Playgroud)

该属性仍然是可配置的,因此您可以根据需要重置它.


或者在回调中使用.entries()而不是.keys()使用参数解构.map().

var val =  {
default: "version1",
version1: "abc.com",
version2: "def.com",
version3:"xyz.com"
};

var res = {
  website: {url: val[Object.defineProperty(val, "default", {enumerable:false}).default]},
  versions: Object.assign(
    ...Object.entries(val).map(([k, v]) => ({[k]: {website: {url: v} } }))
)};

console.log(res);
Run Code Online (Sandbox Code Playgroud)