我有一个看起来像这样的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
设置.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)