2016-09-25 3 views
0

У меня есть строка «path»: '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' 
     } 
    } 
} 

Я пытался реорганизовать с использованием 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);

Смежные вопросы