Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.03.2012, 17:14
Новичок на форуме
Отправить личное сообщение для mgvmax Посмотреть профиль Найти все сообщения от mgvmax
 
Регистрация: 06.03.2012
Сообщений: 8

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


Вот примерно такую штуку нужно провернуть(
Заранее спасибо за помощь!
Ответить с цитированием
  #2 (permalink)  
Старый 06.03.2012, 22:00
Новичок на форуме
Отправить личное сообщение для mgvmax Посмотреть профиль Найти все сообщения от mgvmax
 
Регистрация: 06.03.2012
Сообщений: 8

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'));​
Ответить с цитированием
  #3 (permalink)  
Старый 06.03.2012, 23:31
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

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

Оно?
__________________
оляля, ололо
Ответить с цитированием
  #4 (permalink)  
Старый 07.03.2012, 02:42
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

У Стояна Стефанова этот и не только этот паттерн описывается. Опять я о нём
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #5 (permalink)  
Старый 07.03.2012, 10:20
Новичок на форуме
Отправить личное сообщение для mgvmax Посмотреть профиль Найти все сообщения от mgvmax
 
Регистрация: 06.03.2012
Сообщений: 8

Открыл Стефанова, первое что бросилось в глаза в оглавлении так это не использовать eval()...
Ответить с цитированием
  #6 (permalink)  
Старый 07.03.2012, 10:25
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

А зачем его использовать?
Ответить с цитированием
  #7 (permalink)  
Старый 07.03.2012, 10:30
Новичок на форуме
Отправить личное сообщение для mgvmax Посмотреть профиль Найти все сообщения от mgvmax
 
Регистрация: 06.03.2012
Сообщений: 8

Kolyaj, 9xakep писал
...
var p = eval(s)
....
Ответить с цитированием
  #8 (permalink)  
Старый 07.03.2012, 11:58
Новичок на форуме
Отправить личное сообщение для mgvmax Посмотреть профиль Найти все сообщения от mgvmax
 
Регистрация: 06.03.2012
Сообщений: 8

С получением значения по пути все понятно. А как поместить значение по указанному пути?
Ответить с цитированием
  #9 (permalink)  
Старый 07.03.2012, 12:11
Новичок на форуме
Отправить личное сообщение для mgvmax Посмотреть профиль Найти все сообщения от mgvmax
 
Регистрация: 06.03.2012
Сообщений: 8

Разобрался, вместо return такую конструкцию
parent[path[path.length-1]] = value;
и условие цикла до length-1
Ответить с цитированием
  #10 (permalink)  
Старый 07.03.2012, 16:09
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

Что такого в eval()? И чем return не нравится?
__________________
оляля, ололо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача полю объекта - массиву, значения элемента через set метод poorking Общие вопросы Javascript 1 13.02.2011 20:22