[英]Most elegant way to create a JSON Object
我有一个看起来像这样的javacript对象。
val =
{
default: "version1"
version1: "abc.com"
version2: "def.com"
...
versionn:"xyz.com"
}
我想将它转换为这样的嵌套json
"newval": {
"website": {
"url": "abc.com"
},
"versions": {
"version1": {
"website": {
"url": "abc.com"
}
},
"version2": {
"website": {
"url": "def.com"
}
}
}
}
如果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);
这是避免需要.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);
该属性仍然是可配置的,因此您可以根据需要重置它。
或者在.map()
回调中使用.entries()
而不是.keys()
和参数解构。
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);
我的版本:
var val = {
default: 'version1',
version1: 'abc.com',
version2: 'def.com',
version3: 'xyz.com'
}
var res = {
website: {url: val[val.default]},
versions: Object.entries(val).reduce(function(a, [k, v]) {
if (k != 'default') a[k] = {website: {url: v}}
return a
}, {})
}
console.log(res)
这是我的版本,只是将条目直接减少到websites
属性,不包括default
属性
var val = { default: "version1", version1: "abc.com", version2: "def.com", versionn: "xyz.com" } var result = { newval : {website : val.default}, versions : Object.entries(val).reduce((a,b)=>((b[0] != 'default'?a[b[0]]={website:b[1]}:0),a),{}) }; console.log(result)
您可以通过迭代键并分配给对象来直接为默认值分配零件。
var values = { default: "version1", version1: "abc.com", version2: "def.com", versionn: "xyz.com" }, result = { newval: { website: { url: values[values.default] }, versions: Object.assign(...Object.keys(values).map(k => k === 'default' ? {} : { [k]: { website: { url: values[k] } } })) } }; console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
没有函数调用更高效和兼容:
val = { default:"version1", version1:"abc.com", version2:"def.com", versionn:"xyz.com" } newval = { website: { url: val[val.default] }, versions: { } } for (k in val) if (k !== 'default') newval.versions[k] = { website: { url: val[k] } } console.log({newval})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.