Создание динамического ассоциативного массива в Javascript из JSON

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

Итак, в 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"

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
8 442
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Зачем вам менять массив на другой? -)

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

Это работает. Просто скопируйте его в блок скрипта для тестирования.

    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)
Ответ принят как подходящий

Думаю, вы можете использовать ответ 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. Найденный элемент передается лямбда с ключом элемента. AKA, первым результатом будет name = "datasets_a" item = object. Следишь за мной так далеко? Теперь вы обращаетесь к возвращенному хешу, объекту в item, как если бы у него есть дочерний ключ в name ... "datasets_a". Но подождите, это является объект!

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

в вашем последнем блоке кода это должна быть функция (имя, результат). name является ключом, а result - значением этого ключа.

Leanan 24.10.2008 18:28

Я принял первую часть, так как оказалось, что я мог просто получить прямой доступ к объекту json. Глупо с моей стороны не осознавать этого во-первых.

Leanan 24.10.2008 18:47

Хорошо, в MooTools все наоборот, так что я привык к этой модели.

Robert K 24.10.2008 18:49

+1 за то, что сказал мне data['results']['dataset_a']['dataset_two']['data']; способ вызова json-объектов.

Ish 12.03.2011 01:05

квадратная скобка - это аксессоры, которые можно использовать на массивах arr = [1]; arr[0] и объектах obj = { foo : 'hello world'}; obj['foo']; x = 'foo'; obj[x]

max 08.03.2012 06:18

Другие вопросы по теме