Многомерные ассоциативные массивы в JavaScript
Но в JavaScript ассоциативные массивы вроде этого не работают. После прочтения тонны учебника все, что я мог получить, было следующее:
но arr[‘fred’][‘apple’] = 2; не работает. Я пытался массивы объектов, но свойства объектов не могут быть свободным текстом. Чем больше я читал учебники, тем больше я запутался. Любая идея приветствуется:)
Спасибо за ответы, но я перебираю результаты запроса и хочу установить значения по одному. Строки примера (взяты из примера Matt) var grid = <>;grid[‘aa’][‘bb’] = 1; возвращает «Uncaught TypeError: Невозможно установить свойство ‘bb’ из неопределенного». Я могу ошибаться, но с большинством ваших примеров мне нужно знать данные во время инициализации.
Просто обнаружил, что var grid = <>; grid[‘aa’] = <>; grid[‘aa’][‘bb’] = 1; работает. Более сложный тест не пройден, но, похоже, я на правильном пути
Вы должны сначала инициализировать подобъект, как я уже упоминал в своем ответе. var grid = <>; grd [‘aa’] = <>; тогда вы можете сделать grid [‘aa’] [‘bb’] = 1. Есть много способов проверить, инициализирован ли подобъект (как уже упоминалось в моем ответе), поэтому вы не перезаписываете существующий объект.
обновил мой ответ некоторым дополнительным кодом. не уверен, насколько глубоки ваши объекты или как вы получаете ваши данные, но, надеюсь, укажет вам правильное направление
9 ответов
Просто используйте обычный JavaScript-объект, который будет «читать» так же, как ваши ассоциативные массивы. Вы также должны помнить, что сначала их инициализировать.
var obj = <>; obj['fred'] = <>; if('fred' in obj ) < >// can check for the presence of 'fred' if(obj.fred) < >// also checks for presence of 'fred' if(obj['fred']) < >// also checks for presence of 'fred' // The following statements would all work obj['fred']['apples'] = 1; obj.fred.apples = 1; obj['fred'].apples = 1; // or build or initialize the structure outright var obj = < fred: < apples: 1, oranges: 2 >, alice: < lemons: 1 >>;
Если вы просматриваете значения, у вас может быть что-то похожее на это:
var people = ['fred', 'alice']; var fruit = ['apples', 'lemons']; var grid = <>; for(var i = 0; i < people.length; i++)< var name = people[i]; if(name in grid == false)< grid[name] = <>; // must initialize the sub-object, otherwise will get 'undefined' errors > for(var j = 0; j < fruit.length; j++)< var fruitName = fruit[j]; grid[name][fruitName] = 0; >>
Удалось использовать пример с рабочим кодом (расширение Chrome) и работает отлично. Благодарю. Наконец-то я понимаю, как обрабатывать объекты в JS!
Не могу подтвердить этот ответ достаточно! Часть, которая заставляла мой объект постоянно возвращать неопределенное, заключалась в том, что я НЕ инициализировал подобъект. Поэтому обязательно сделайте это! пример: grid[name] = <>;
@Matt Есть ли способ получить obj.fred.apples, используя только один набор []? Я предполагаю, что нет. obj[«fred.apples»] например
Что если мы не знаем номер массива, например, ваш код [javasript] var people = [‘fred’, ‘alice’]; var fruit = [‘яблоки’, ‘лимоны’]; var color = [‘red’, ‘blue’] var . -> номер массива неизвестен [/ javascript]
Если он не должен быть массивом, вы можете создать «многомерный» объект JS.
JSON на самом деле является «строковым» форматом объекта JavaScript. То, что у вас есть, это не JSON, а просто объект JavaScript.
Javascript является гибким:
var arr = < "fred": , "mary": <> //etc, etc >; alert(arr.fred.orange); alert(arr["fred"]["orange"]); for (key in arr.fred) alert(key + ": " + arr.fredJavascript многомерные ассоциативные массивы);
Я бы сказал, что имя переменной ‘arr’ здесь неверно, потому что на самом деле это не массив, а объект.
так как мне нужно было получить все элементы хорошим способом, я столкнулся с этой темой. прохождение 2-мерного ассоциативного массива/объекта — неважно, для меня имя, потому что функциональность имеет значение
var imgs_pl= , 'portfolio':, 'special': >; for (key in imgs_pl) < console.log(key); for (subkey in imgs_plJavascript многомерные ассоциативные массивы) < console.log(imgs_plJavascript многомерные ассоциативные массивы[subkey]); >>
Похоже, что для некоторых приложений в javascript есть гораздо более простой подход к многомерным ассоциативным массивам.
- Учитывая, что внутреннее представление всех массивов фактически является объектами объектов, было показано, что время доступа для численно проиндексированных элементов фактически такое же, как для ассоциативных (текстовых) индексированных элементов.
- время доступа для ассоциативно-индексированных элементов первого уровня не увеличивается с увеличением количества фактических элементов.
Учитывая это, может быть много случаев, когда на самом деле лучше использовать каскадный строковый подход для создания эквивалентности многомерных элементов. Например:
store['fruit']['apples']['granny']['price] = 10 store['cereal']['natural']['oats']['quack'] = 20
store['fruit.apples.granny.price'] = 10 store['cereal.natural.oats.quack'] = 20
Преимущества включают в себя:
- не нужно инициализировать подобъекты или выяснить, как лучше всего комбинировать объекты
- одноуровневое время доступа. объектам внутри объекта нужно N раз времени доступа
- можно использовать Object.keys(), чтобы извлечь всю информацию о размерах и..
- можно использовать функцию regex.test(string) и функцию array.map на клавишах, чтобы вытащить именно то, что вы хотите.
- нет иерархии в измерениях.
- «точка» произвольна — использование подчеркивания на самом деле облегчает регулярное выражение
- Есть много сценариев для «выравнивания» JSON в и из этого формата
- может использовать все другие приятные функции обработки массива в списке ключей
Получить значение для массива свойств ассоциативных массивов, когда имя свойства является целым числом:
Начиная с ассоциативного массива, где имена свойств являются целыми числами:
Переместить элементы в массив:
categories.push(); categories.push();
Прокрутите массив и сделайте что-нибудь со значением свойства.
Выход консоли должен выглядеть следующим образом:
1 : Category 1 2 : Category 2 3 : Category 3 4 : Category 4 2300 : Category 2300 2301 : Category 2301
Как вы можете видеть, вы можете обойти ограничение ассоциативного массива и иметь имя свойства как целое.
ПРИМЕЧАНИЕ. Ассоциативный массив в моем примере — это json, который вы имели бы, если бы вы сериализовали объект Dictionary [].
Не используйте массив, используйте объект.
не используйте new Object() , так как к Object.prototype может быть прикреплена странность; используйте литерал объекта: var foo = <>;
@Michael Майкл, я думал, что <> был просто синтаксическим сахаром для нового Object (); Очень похоже на [] сокращение от нового массива ()
с моей консоли Chrome JS оба этих элемента выглядят одинаково, включая их прототипы. Даже добавление Object.prototype.foo = function () <> появляется в обоих.
@Matt см. «Конструкторы и новые» в jslint.com/lint.html, а также stackoverflow.com/questions/383402/…, где многие люди говорят, что это хулиганы. так время зерно-о-соли.
Вам необязательно использовать объекты, вы можете сделать это с помощью обычных многомерных массивов.
Это мое решение без объектов:
// Javascript const matrix = []; matrix.key1 = [ 'value1', 'value2', ]; matrix.key2 = [ 'value3', ];
который в PHP эквивалентен:
// PHP $matrix = [ "key1" => [ 'value1', 'value2', ], "key2" => [ 'value3', ] ];
Ещё вопросы
- 1 Android: небуферизованный ввод-вывод
- 0 Перетаскивание JQuery не показывает перетаскиваемый элемент после добавления в список
- 1 Влияет ли размер приложения Android на неиспользуемый импорт?
- 0 $ get property для службы $ http / $ resource?
- 0 Как сделать флажок установленным, если условие выполняется?
- 0 eJabberd с PHP Extauth
- 1 C # Отображение JPG изображения с WPF не работает
- 1 Объединение массивов Numpy 2d при гарантированном ненулевом равенстве
- 0 При нажатии на миниатюру изображение должно отображаться в отдельном разделе.
- 1 Где я могу найти больше информации о разрешениях для Android?
- 0 Воспроизведение MP3 с петлей в качестве переменной
- 0 Почему мой угловой пейджинг не работает?
- 0 Плагин jQuery Mask со знаком%
- 0 AngularJS $ state.go нет перенаправления с ExpressJS
- 0 Мой запрос на выборку возвращает 0, хотя у меня есть значения в моей базе данных
- 1 Как получить только дату или время только в реакции на нативный
- 0 Ось даты JQPlot не представляет график
- 0 Как получить значение sql AS в Laravel?
- 0 Получение history.js для запуска функции
- 0 получить доступ к главной таблице из реплики
- 0 CSS3 переходы вместо jQuery
- 1 Модуль веб-модуля RefrenceError не определен
- 1 JavaScript проблема об «этом»
- 0 угловой JS $ HTTP вернуть true или false
- 0 Как я могу использовать кнопку WindowsFormApplication для переключения между двумя приложениями Windows (заставить их наверх)?
- 1 Используйте разные поля для проверки в ASP.NET Identity
- 0 Встроенный API возвращает String вместо JSON
- 1 FolderBrowserDialog с MVC 4?
- 1 Поле со списком asp.net mvc
- 0 Угловая маршрутизация мини контролера до пункта маршрута
- 0 получить записи с той же строкой JSON
- 1 Java вводит десятичные дроби и работает с мнимыми числами
- 1 Как условно покрасить ячейки Excel вывода в Python?
- 0 Избегание комментариев с C ++ getline ()
- 0 Пользовательская директива для заполнения выпадающего списка
- 0 Добавить значение даты и времени
- 0 получение данных JSON в сервис angularJS и сравнение для входа в систему
- 0 Компресс Классы DAO слоя
- 0 Бесконечный цикл Date на одном сервере, но работает на другом и localhost
- 1 Android предотвращает удаление автономных данных или базы данных при событии «Очистить данные»
- 1 Можно узнать, был ли модуль Python перезагружен?
- 0 JQuery Searchbox IE9 проблема
- 0 Получение ожидаемой ошибки неквалифицированного идентификатора с C ++ при попытке выполнить
- 1 Сбой смешивания с ObservableAsPropertyHelper
- 0 Детрукторы и унаследованные функции c ++
- 0 Как перенаправить пользователя на «домашнюю» страницу после проверки его данных для входа в базу данных?
- 1 Как вызвать метод в другом классе из универсального метода?
- 0 использовать мод начальной загрузки без отдельного контроллера
- 1 Как бороться с зависимыми полями при сериализации?
- 1 Получить все div под div с известным идентификатором и перебрать его