2016-06-13 5 views
2

JSオブジェクトにドット表記で直列化されたオブジェクトを変換する機能を改善:Iがオブジェクトにデシリアライズする必要がある文字列<code>"presentation.launchBehavior.newWindow"</code>を有する

var obj = {presentation: {launchBehavior: 'newWindow'}} 

ドット後の最後の文字列値であるべきで、他の文字列ながら文字列に変換する必要があります。それは働いて

function des(obj, property, index, ar) { 
    var isLastCall = ar.length - 1 === index; 
    if (isLastCall) { 
     return; 
    } 

    var isNextLastCall = ar.length - 2 === index; 
    if (isNextLastCall) { 
     obj[property] = ar[ar.length - 1]; 
     return obj; 
    } else { 
     obj[property] = {}; 
     return obj[property]; 
    } 
} 

var obj = {}; 
"presentation.launchBehavior.newWindow".split(".").reduce(des, obj); 
obj.presentation.launchBehavior // newWindow 

が、私が代わりに関数の外の変数を作成することの結果のオブジェクトを返すようにそれを改善したいと思います:私はそれを行うための関数を書きました。どうやってやるの?多分、機能の内部も改善することができます。

+1

あなたが動作するコードを改善したい場合は、[codereview.se]に投稿しなければなりません。 –

答えて

2

あなたはreduceRightを使用することができます。

const des = str => str.split(".").reduceRight((prev, key) => ({[key]: prev})); 
 

 
console.log(des("presentation.launchBehavior.newWindow"));

1

ここで私はそれをやります。

function des(str) { 
 
    var props = (typeof str === "string") ? str.split('.') : str; 
 
    return props.length > 1 ? {[props[0]]: des(props.slice(1))} 
 
          : props[0]; 
 
} 
 

 
console.log(des("presentation.launchBehavior.newWindow"));

これはアレイ計算特性(var o = {[key]: val})を使用します。古いブラウザでは動作しないことがあります。古いブラウザでは、最初にオブジェクトassign thenプロパティ(var o = {}; o[key] = val;)を作成する必要があります。

+0

おかげさまで、 'reduceRight'の答えはよりきれいに見えます - あなたはどう思いますか? –

+0

はい、それは良い、そして賢いです。 –

関連する問題