2017-09-24 9 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" 
     } 
    } 
} 

}

私のバージョンでは、多くを使用しています。このJSONを変換/作成するエレガントな方法はありますか?デフォルトのバージョンすなわち

はnewval.websiteの下に来て、すべてのバージョンのデータはモミnewval.website.versionsが

答えて

8

.websiteプロパティを設定すると、非常に単純である値である1です。 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);

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プロパティに直接エントリを減らし、もう少し効率的

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

defaultプロパティを除くと、機能のない互換性呼び出しで:

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

関連する問題