2016-08-24 5 views
1

ここでself変数を回避するにはどうすればよいですか?機能的なJavaScript、割り当てを解除する

function urlBuilder(endpoint){ 
    var status = ["user_timeline", "home_timeline", "retweets_of_me", "show", "retweets", 
      "update", "update_with_media", "retweet", "unretweet", "retweeters", "lookup" 
     ], 
     friendships = ["incoming", "outgoing", "create", "destroy", "update", "show"]; 
    let endpoints = { 
     status: status, 
     friendships: friendships 
    } 

    var self = { }; 

    endpoints[endpoint].forEach(e => { 
     self[e] = endpoint + "/" + e; 
    }); 

    return self; 

} 

でも、やはり代入文です。

return [{}].map(el => { 
    endpoints[endpoint].forEach(e => { 
    el[e] = endpoint + "/" + e; 
    }); 
    return el; 
})[0]; 
+0

なぜあなたはしたいですか? –

+1

主に真夜中ですから。ただ探検する。 –

+1

私の理解では、あなたの最初のアプローチがよかったです。あなたは '.map'のために特別で不要な繰り返しを追加しています。また、 'self'はコンテキスト変数の従来の名前です。代わりに可読性が低下します。 – Rajesh

答えて

4

本当にできません。動的なプロパティの数を持つオブジェクトを作成するには(常にJSON.parseを使用せずに)、代入などでそれを変更する必要があります。

あなたの最善の策は、非常に機能的である

return endpoints[endpoint].reduce((self, e) => { 
    self[e] = endpoint + "/" + e; 
    return self; 
}, {}); 

かもしれません。

+0

これはどうですか?動的な数のプロパティを持つオブジェクトを取得する機能的な方法です。 https://jsfiddle.net/ny4x17a0/ –

+1

@MegaMan他のソリューションと同じように、「acc」への代入を使用しています。そして、 'arr.shift()'はあなたの入力を突然変異させているので絶対に機能しません(そしてその上で遅くなります)!本当に単純に 'reduce'を使うべきです。 – Bergi

+0

私は家に帰る途中でそれがそれほど良くなかったことに気付きました:そして、シフトを取得していた最初の反復は、シフトされた要素を返すので、2番目に移動したときにエラーが定義されていません。 –

1

Object.assignも使用できます。

accは突然変異しますが、reduceコールにローカライズされています。

endpoints[endpoint].reduce((acc, e) => 
    Object.assign(acc, { [e]: `endpoint/${e}` }), {}) 
関連する問題