Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получение значения поля объекта зная путь к полю и сам объект (https://javascript.ru/forum/misc/26380-poluchenie-znacheniya-polya-obekta-znaya-put-k-polyu-i-sam-obekt.html)

mgvmax 06.03.2012 17:14

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


Вот примерно такую штуку нужно провернуть(
Заранее спасибо за помощь!

mgvmax 06.03.2012 22:00

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'));​

9xakep 06.03.2012 23:31

<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>

Оно?

FINoM 07.03.2012 02:42

У Стояна Стефанова этот и не только этот паттерн описывается. Опять я о нём :)

mgvmax 07.03.2012 10:20

Открыл Стефанова, первое что бросилось в глаза в оглавлении так это не использовать eval()...

Kolyaj 07.03.2012 10:25

А зачем его использовать?

mgvmax 07.03.2012 10:30

Kolyaj, 9xakep писал
...
var p = eval(s)
....

mgvmax 07.03.2012 11:58

С получением значения по пути все понятно. А как поместить значение по указанному пути?

mgvmax 07.03.2012 12:11

Разобрался, вместо return такую конструкцию
parent[path[path.length-1]] = value;
и условие цикла до length-1

9xakep 07.03.2012 16:09

Что такого в eval()? И чем return не нравится?


Часовой пояс GMT +3, время: 04:47.