Этот вопрос уже имеет ответ здесь:
Я пробую что-то вроде этого, но этот пример не работает.
jsObj = {};
for (var i = 1; i <= 10; i++) {
jsObj{'key' + i} = 'example ' + 1;
}
Что я могу сделать для создания динамического ключа как это?
Квадратные скобки:
jsObj['key' + i] = 'example' + 1;
В JavaScript все массивы являются объектами, но не все объекты являются массивами. Основное различие (и то, которое довольно трудно имитировать с помощью JavaScript и простых объектов) заключается в том, что экземпляры массивов поддерживают свойство length
таким образом, что оно отражает единицу плюс числовое значение свойства, имя которого является числовым и значение которого, при преобразовании в число, является наибольшим из всех таких свойств. Это звучит очень странно, но это означает, что для экземпляра массива свойства с именами "0"
, "5"
, "207"
и так далее рассматриваются особым образом, поскольку их существование определяет значение length
. И, кроме того, значение length
может быть установлено, чтобы удалить такие свойства. Установка длины
массива в 0
эффективно удаляет все свойства, имена которых выглядят как целые числа.
Хорошо, вот что делает массив особенным. Однако все это не имеет никакого отношения к тому, как работает оператор JavaScript [ ]
. Этот оператор - механизм доступа к свойствам объекта, который работает с любым объектом. В связи с этим важно отметить, что имена свойств числовых массивов не являются чем-то особенным с точки зрения простого доступа к свойствам. Это просто строки, которые выглядят как числа, но имена свойств объектов JavaScript могут быть любыми строками.
Таким образом, то, как оператор [ ]
работает в цикле for
, итерирующем массив:
for (var i = 0; i < myArray.length; ++i) {
var value = myArray[i]; // property access
// ...
}
на самом деле не отличается от того, как [ ]
работает при доступе к свойству, имя которого является некоторой вычисляемой строкой:
var value = jsObj["key" + i];
Оператор [ ]
делает точно одно и то же в обоих случаях. Тот факт, что в одном случае объектом является массив, не имеет значения, другими словами.
При установке значений свойств с помощью [ ]
, история та же за исключением особого поведения при сохранении свойства length
. Если вы установите свойство с числовым ключом для экземпляра массива:
myArray[200] = 5;
то (предполагая, что "200" - это самое большое числовое имя свойства) свойство length
будет обновлено до 201
как побочный эффект назначения свойства. Однако, если то же самое сделать с обычным объектом,
myObj[200] = 5;
такого побочного эффекта не будет. Свойство под названием "200" и массива, и объекта будет установлено в значение 5
точно таким же образом.
Можно подумать, что поскольку такое поведение с длиной
является довольно удобным, можно с тем же успехом сделать все объекты экземплярами конструктора Array вместо обычных объектов. В этом нет ничего плохого (хотя это может сбить с толку, особенно людей, знакомых с некоторыми другими языками, когда одни свойства включаются в length
, а другие нет). Однако, если вы работаете с сериализацией JSON (довольно распространенная вещь), поймите, что экземпляры массивов сериализуются в JSON таким образом, что только включает свойства с числовыми именами. Другие свойства, добавленные в массив, никогда не появятся в сериализованном JSON виде. Так, например:
var obj = [];
obj[0] = "hello world";
obj["something"] = 5000;
var objJSON = JSON.stringify(obj);
значением "objJSON" будет строка, содержащая только ["hello world"]
; свойство "something" будет потеряно.
Если вы можете использовать возможности ES6 JavaScript, вы можете использовать Вычисляемые имена свойств, чтобы справиться с этим очень легко:
var key = 'DYNAMIC_KEY',
obj = {
[key]: 'ES6!'
};
console.log(obj);
// > { 'DYNAMIC_KEY': 'ES6!' }
Ассоциативные массивы в JavaScript на самом деле работают не так, как в других языках. для каждого
операторов являются сложными (потому что они перечисляют унаследованные свойства прототипа). Вы можете объявить свойства в объектном / ассоциативном массиве, как упоминал Пойнти, но на самом деле для такого рода вещей вы должны использовать массив с методом push
:
jsArr = [];
for (var i = 1; i <= 10; i++) {
jsArr.push('example ' + 1);
}
Просто не забывайте, что индексированные массивы равны нулю -based, поэтому первым элементом будет jsArr [0], а не jsArr [1].