2017-09-24 89 views
2

我有一個看起來像這樣的javacript對象。最優雅的方式來創建一個JSON對象

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來了一個和所有版本的數據值杉newval.website.versions

回答

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);


下面是需要避免的.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);

屬性仍然是可配置的,所以如果需要的話,你可以重新設置。


或者使用.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);

2

我的版本:

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) 
1

您可以分配是通過遍歷鍵和分配對象爲默認直接部分和其餘部分。

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; }

2

這是我的版本,只是減少了條目直接進入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)

1

有點更高效,兼容而沒有功能呼叫:

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})

相關問題