Когда я создаю новый массив JavaScript и использую целое число в качестве ключа, каждый элемент этого массива до целого числа создается как неопределенный.
Например:
var test = new Array();
test[2300] = 'Some string';
console.log(test);
выведет 2298 неопределенных и одну «Некоторую строку».
Как мне заставить JavaScript использовать 2300 в качестве строки вместо целого числа или как я могу предотвратить создание экземпляров 2299 пустых индексов?
javascript
associative-array
Питер Мортенсен
источник
источник
0.25
и.25
разрешите ту же строку"0.25"
. Так что если вы используете дробные ключи, вы можете получить свойство численно установить ключ ,0.25
используя0.25
,.25
,"0.25"
но не".25"
.Вы можете просто использовать объект:
источник
Как говорят люди, JavaScript преобразует числовую строку в целое число, поэтому его нельзя использовать напрямую в ассоциативном массиве, но я думаю, объекты будут работать для вас аналогичным образом.
Вы можете создать свой объект:
И добавляем значения по мере работы массива:
Это даст вам:
После этого вы можете получить к нему доступ как к массиву на других языках, получив ключ:
Протестировал и работает.
источник
Если вариант использования хранит данные в коллекции, то ECMAScript 6 предоставляет
Map
тип.Только тяжелее инициализировать.
Вот пример:
Результат:
источник
Составление других ответов:
Объект
При использовании числа в качестве ключа нового свойства число превращается в строку:
При доступе к значению свойства с использованием того же номера число снова превращается в строку:
Однако при получении ключей от объекта они не будут превращены обратно в числа:
карта
ECMAScript 6 позволяет использовать объект Map ( документация , сравнение с Object ). Если ваш код предназначен для локальной интерпретации или таблица совместимости ECMAScript 6 выглядит достаточно зеленой для ваших целей, рассмотрите возможность использования карты:
Преобразование типов не выполняется, к лучшему или к худшему:
источник
Используйте объект вместо массива. Массивы в JavaScript не являются ассоциативными массивами. Это объекты с магией, связанные с любыми свойствами, имена которых выглядят как целые числа. Эта магия - не то, что вам нужно, если вы не используете их как традиционную структуру, подобную массиву.
источник
Попробуйте использовать объект, а не массив:
источник
var a = []; a[Math.pow(2, 30)] = 'hello';
и вы не увидите, что использование браузера / памяти увеличится более чем на гигабайт, но вы увидите, чтоa.length
это 1073741824. Виртуальные машины явно хранят некоторые «массивы» с использованием какой-то другой структуры данных, я предполагаю просто хеш-таблицу, по крайней мере, если они достаточно редки.Получить значение свойства ассоциативного массива, если имя свойства является целым числом:
Начиная с ассоциативного массива, в котором имена свойств являются целыми числами:
Перенести элементы в массив:
Прокрутите массив и сделайте что-нибудь со значением свойства.
Вывод в консоль должен выглядеть так:
Как видите, вы можете обойти ограничение ассоциативного массива и сделать имя свойства целым числом.
ПРИМЕЧАНИЕ. Ассоциативный массив в моем примере - это содержимое JSON, которое вы получили бы, если сериализовали объект Dictionary <string, string> [].
источник
Используйте объект с целым числом в качестве ключа, а не массив.
источник
Иногда я использую префиксы для своих ключей. Например:
Теперь у вас нет проблем с доступом к ним.
источник