簡體   English   中英

最優雅的方式來創建一個JSON對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM