Получение значения поля объекта зная путь к полю и сам объект
Здравствуйте. Есть огромная форма, с боольшим количеством input'ов (до 1500), есть массив данных который привязан к форме с помощью KnockoutJs (паттерн MVVM), естественно гонять туда сюда всю модель данных очень накладно, поэтому была выработана идея что с сервера идут только поля которые подлежат обновлению в виде ключ:значение...
Ключ представляет собой строку содержащую путь к объекту например "viewModel.user.surname" или "user.surname" (префикс это viewModel). На клиенте уже есть заполненный объект viewModel. Вопрос как зная путь, в виде строки, и сам объект, к которому относится этот путь, получить значение? например
var viewModel = {... заполненный обьект... };
viewModel.user.surname = "Maxim";
var s = "user.surname"; //строка путь
var result = SomeFunctionGet(viewModel, s); //что поместить в SomeFunction?
//в итоге в result должна содержаться строка "Maxim"
SomeFunctionSet(viewModel, s, "sometext"); //помещает значение в viewModel по указанному в s пути
Вот примерно такую штуку нужно провернуть( Заранее спасибо за помощь! |
JavaScript поражает меня всё больше и больше, знаком я с ним очень мало, но просто приятно работать
Ответ на собственный вопрос:
var obj = {
foo: { bar: 'baz', user: {name: 'MAxim', login: {name: 'maxim', hash: 'sdfdf32r37887'}} }
};
var deep_value = function(obj, path){
var path = path.split('.');
var result = obj;
for (var i=0, len=path.length; i<len; i++){
alert(path[i]);
result = result[path[i]];
};
return result;
};
alert(deep_value(obj, 'foo.user.login.hash'));
|
<script>
var obj = {
users: {
name: 'max'
}
}
var s = 'users.name'
function getName(ob) {
with(ob) {
var p = eval(s)
return p
}
}
alert(getName(obj))
</script>
Оно? |
У Стояна Стефанова этот и не только этот паттерн описывается. Опять я о нём :)
|
Открыл Стефанова, первое что бросилось в глаза в оглавлении так это не использовать eval()...
|
А зачем его использовать?
|
Kolyaj, 9xakep писал
... var p = eval(s) .... |
С получением значения по пути все понятно. А как поместить значение по указанному пути?
|
Разобрался, вместо return такую конструкцию
parent[path[path.length-1]] = value; и условие цикла до length-1 |
Что такого в eval()? И чем return не нравится?
|
| Часовой пояс GMT +3, время: 06:08. |