Как я создаю динамический ключ, который будет добавлен к переменной объекта JavaScript [дубликат]

Этот вопрос уже имеет ответ здесь:

Я пробую что-то вроде этого, но этот пример не работает.

jsObj = {};

for (var i = 1; i <= 10; i++) {
    jsObj{'key' + i} = 'example ' + 1;
}

Что я могу сделать для создания динамического ключа как это?

196
задан Peter Mortensen 15 March 2016 в 12:53
поделиться

2 ответа

Квадратные скобки:

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" будет потеряно.

ES2015:

Если вы можете использовать возможности ES6 JavaScript, вы можете использовать Вычисляемые имена свойств, чтобы справиться с этим очень легко:

var key = 'DYNAMIC_KEY',
    obj = {
        [key]: 'ES6!'
    };

console.log(obj);
// > { 'DYNAMIC_KEY': 'ES6!' }
434
ответ дан 23 November 2019 в 05:18
поделиться

Ассоциативные массивы в JavaScript на самом деле работают не так, как в других языках. для каждого операторов являются сложными (потому что они перечисляют унаследованные свойства прототипа). Вы можете объявить свойства в объектном / ассоциативном массиве, как упоминал Пойнти, но на самом деле для такого рода вещей вы должны использовать массив с методом push :

jsArr = []; 

for (var i = 1; i <= 10; i++) { 
    jsArr.push('example ' + 1); 
} 

Просто не забывайте, что индексированные массивы равны нулю -based, поэтому первым элементом будет jsArr [0], а не jsArr [1].

3
ответ дан 23 November 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: