2014-10-20 2 views
0

Я пытался создать функцию, способную установить определенное значение объекта, имеющий «путь» свойства:node.js установить свойство из строки имени свойства

reflectionSet = function(obj, propString, value) { 
    var current = obj; 
    var splitted = propString.split('.'); 
    splitted.forEach(function(k) { 
     current = current[k]; 
    }) 
    current = value; 
} 
var test = { 
    a: { 
     s: 'asd', 
     g: 'asasdasdd' 
    } 
}; 

reflectionSet(test, 'a.g', "otherValue"); 

и это должно стать:

{ 
    a: { 
     s: 'asd', 
     g: 'otherValue' 
    } 
} 

к сожалению, это не работает .. Спасибо

+0

Это потому, что JavaScript является "передача по значению". Это означает, что когда вы собираете переменную g, вы не будете изменять значение в объекте. Просто значение, которое вы собрали в объекте. [Здесь] (http://stackoverflow.com/questions/6605640/javascript-by-reference-vs-by-value) является более информативным объяснением – magnudae

ответ

1

Вы можете использовать расколоть свойства, основанные на ., а затем с помощью Array.prototype.reduce, получить до в нер большая часть объекта и обновить его, как этот

function reflectionSet(obj, propString, value) { 
    return propString.split(".").reduce(function(result, part, index, array) { 
     if (index === array.length - 1) { 
      result[part] = value; 
      return obj; 
     } 
     return result[part]; 
    }, obj); 
} 

var test = { 
    a: { 
     s: 'asd', 
     g: 'asasdasdd' 
    } 
}; 

console.log(reflectionSet(test, 'a.g', "otherValue")); 

Выход

{ 
    a: { 
     s: 'asd', 
     g: 'otherValue' 
    } 
} 
+0

currentItam не установлен – rodi

+0

@rodi Упс, была опечатка. Я исправил это сейчас. Пожалуйста, проверьте. – thefourtheye

1

Эта исправленная версия вашей функции должны это сделать.

reflectionSet = function(obj, prop, value) { 
    prop = prop.split('.'); 
    var root = obj, i; 
    for(i=0; i<prop.length; i++) { 
     if(typeof root[prop[i]] == 'undefined') root[prop[i]] = {}; 
     if(i === prop.length - 1) root[prop[i]] = value; 
     root = root[prop[i]]; 
    } 
    return obj; 
}; 

Сейчас:

var test = { a: { s: 'asd', g: 'asasdasdd' } }; 
reflectionSet(test, 'a.g', "otherValue"); 

Вернется { a: { s: 'asd', g: 'otherValue' } }