Получение значения поля объекта зная путь к полю и сам объект
Здравствуйте. Есть огромная форма, с боольшим количеством 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, время: 20:09. |