Динамическое Ассоциативное Создание Массива в Javascript от JSON - PullRequest
2 голосов
/ 24 октября 2008

Звучит намного сложнее, чем на самом деле.

Итак, в Perl вы можете сделать что-то вроде этого:

foreach my $var (@vars) {
  $hash_table{$var->{'id'}} = $var->{'data'};
} 

У меня есть объект JSON, и я хочу сделать то же самое, но с ассоциативным массивом javascript в jQuery.

Я пробовал следующее:

hash_table = new Array();

$.each(data.results), function(name, result) {
  hash_table[result.(name).extra_info.a] = result.(name).some_dataset;
});

Где данные - это объект JSON, полученный из вызова $ .getJSON. Это выглядит примерно так (мой синтаксис JSON может быть немного не так, извините):

{
  results:{
    datasets_a:{
      dataset_one:{
        data:{
          //stuff
        }
        extra_info:{
          //stuff
        }
      }
      dataset_two:{
         ...
      }
      ...
    }
    datasets_b:{
      ...
    }
  }
}

Но каждый раз, когда я делаю это, firebug выдает следующую ошибку:

«Фильтр XML применяется к не-XML-данным»

Ответы [ 3 ]

3 голосов
/ 24 октября 2008

Я думаю, что вы можете использовать ответ JSON в качестве ассоциативного массива. Таким образом, вы должны иметь возможность напрямую войти и использовать JSON.

Предполагая, что вы получили приведенный выше пример:

$('result').innerHTML = data['results']['dataset_a']['dataset_two']['data'];
// Or the shorter form:
$('result').innerHTML = data.results.dataset_a.dataset_two.data;

Поймите, что я не проверял это, но безопаснее использовать квадратные скобки с переменной, чем использовать круглые скобки плюс имя с точкой доступа.

Ваш пример терпит неудачу из-за какой-то запутанной логики, которую я только что уловил.

$.each(data.results), function(name, result) {
     hash_table[result.(name).extra_info.a] = result.(name).some_dataset;
});

Теперь цикл foreach проходит через переменную data.results, чтобы найти внутренние элементы на глубине 1. Найденный элемент передается лямбда-ключу с ключом элемента. АКА, первый результат будет name = "datasets_a" item = object. Следите за мной до сих пор? Теперь вы получаете доступ к возвращенному хешу, объекту в item, как если бы он имел дочерний ключ в name ... "datasets_a". Но подождите, этот является объектом!

Если ничего не помогает ... динамически запишите свой результат JSON в текстовое поле и убедитесь, что он правильно отформатирован.

0 голосов
/ 24 октября 2008

Это работает. Просто дамп для проверки в блок скрипта.

    d = {
      'results':{
       'datasets_a':{
          'dataset_one':{
            'data':{
              'sample':'hello'
            },
            'extra_info':{
              //stuff
            }
          },
      'dataset_two':{
            ///
          }
          ///
    },
        'datasets_b':{
         ///
        }
      }
}
alert(d.results.datasets_a.dataset_one.data.sample)

Я надеюсь, что это вставлено правильно. Этому редактору не нравятся мои разрывы строк в коде.

d = {
  'results':{
   'datasets_a':{
      'dataset_one':{
        'data':{
          'sample':'hello'
        },
        'extra_info':{
          //stuff
        }
      },
      'dataset_two':{
        ///
      }
      ///
    },
    'datasets_b':{
     ///
    }
  }
};

alert(d.results.datasets_a.dataset_one.data.sample)
0 голосов
/ 24 октября 2008

Почему вы хотите изменить массив в другой массив? -)

- почему бы просто не получить доступ к данным, если вы хотите упростить или отфильтровать, вы можете напрямую обойти массивы объекта! -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...