2016-09-25 14 views
0

私はパス文字列を持っています:'profile.name.en';forEachを使用して動的にネストされたオブジェクトを作成します。

これを使用してオブジェクトを動的に作成したいと考えています。私は、この関数とその作業を使用しています:

function set(obj, path, value) { 
    var schema = obj; // a moving reference to internal objects within obj 
    var arr = path.split('.'); 
    var len = arr.length; 

    for(var i = 0; i < len-1; i++) { 
     var elem = arr[i]; 
     if(!schema[elem]) schema[elem] = {}; 
     schema = schema[elem]; 
    } 
    schema[arr[len-1]] = value; 
    return schema; 
} 

はこのようにそれを使用します。

var a = {}; 
var path = 'profile.name.en'; 
var profileName = 'OleFrank'; 
var o = set(a, path, profileName); 

// result 
{ 
    profile: { 
     name: { 
      en: 'OleFrank' 
     } 
    } 
} 

私はforループのforEachを使用しての代わりにリファクタリングしようとしたが、それはもう働いていません。どうしてこれなの??

+0

とバージョン私達にあなたのforeachの試みを表示します。 – Turnip

+0

レキシカルスコープによって引き起こされる可能性があります... –

+0

なぜforEach?減らすほうが良いでしょう。 –

答えて

0

外部参照を保持せずに、必要なオブジェクトを返すので、Array#reduceを使用できます。

function set(object, path, value) { 
 
    var keys = path.split('.'), 
 
     last = keys.pop(); 
 

 
    keys.reduce(function (o, k) { 
 
     return o[k] = o[k] || {}; 
 
    }, object)[last] = value; 
 
} 
 

 
var a = {}, 
 
    path = 'profile.name.en', 
 
    profileName = 'OleFrank'; 
 

 
set(a, path, profileName); // no need of an assignment, because of 
 
          // call by reference with an object 
 

 
console.log(a);

Array#forEach

function set(object, path, value) { 
 
    var keys = path.split('.'), 
 
     last = keys.pop(); 
 

 
    keys.forEach(function (k) { 
 
     object[k] = object[k] || {}; 
 
     object = object[k]; 
 
    }); 
 
    object[last] = value; 
 
} 
 

 
var a = {}, 
 
    path = 'profile.name.en', 
 
    profileName = 'OleFrank'; 
 

 
set(a, path, profileName); 
 

 
console.log(a);

関連する問題