如何创build要添加到JavaScript对象variables的dynamic键

我正在尝试这样的事情,但这个例子不起作用。

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

我能做些什么来制作这样一个dynamic的关键?

方括号:

 jsObj['key' + i] = 'example' + 1; 

在JavaScript中,所有的数组都是对象,但并不是所有的对象都是数组。 主要的区别(很难用直接的JavaScript和普通对象来模仿)是数组实例维护length属性,以便它反映名称为数字的属性的数值,当数值转换为数字时,是所有这些财产中最大的。 这听起来很奇怪,但这仅仅意味着给定一个数组实例,具有诸如"0""5""207"等名称的属性都被特别处理,因为它们的存在决定了length的值。 而且,最重要的是,可以设置 length的值来消除这些属性。 将数组length设置为0有效地删除名称看起来像整数的所有属性。

好的,这就是数组特殊的地方。 但是,所有这些与JavaScript [ ]运算符的工作原理没有任何关系。 该运算符是对任何对象都有效的对象属性访问机制。 在这方面需要注意的是,就简单的属性访问而言,数组的属性名称并不是特殊的。 它们只是看起来像数字的string,但JavaScript对象属性名称可以是任何types的string。

因此, [ ]运算符在for循环中遍历一个数组的方式:

 for (var i = 0; i < myArray.length; ++i) { var value = myArray[i]; // property access // ... } 

[ ]在访问名称为某个计算string的属性时工作的方式确实没有什么不同:

 var value = jsObj["key" + i]; 

这两个实例中的[ ]运算符完全相同。 事实上,在一种情况下,涉及的对象恰好是一个数组是不重要的,换句话说。

使用[ ] 设置属性值时, 除了保持length属性的特殊行为之外 ,故事是相同的。 如果您在数组实例上使用数字键设置属性:

 myArray[200] = 5; 

那么(假定“200”是最大的数字属性名称), length属性将被更新为201作为属性分配的副作用。 但是,如果对一个普通对象也做同样的事情,那么:

 myObj[200] = 5; 

没有这样的副作用。 数组和对象的属性“200”将被设置为值5 ,否则以完全相同的方式。

有人可能会认为,因为那个length行为是很方便的,所以你可能会使Array构造函数的所有对象实例而不是普通对象。 没有什么直接的错误(尽pipe这可能会让人困惑,尤其是对于熟悉其他语言的人来说,某些属性被包含在length而不是其他属性)。 但是,如果您正在使用JSON序列化(一个相当常见的事情),请理解数组实例是以包含数字命名属性的方式序列化为JSON。 添加到数组的其他属性将永远不会出现在序列化的JSON表单中。 举个例子:

 var obj = []; obj[0] = "hello world"; obj["something"] = 5000; var objJSON = JSON.stringify(obj); 

“objJSON”的值将是一个只包含["hello world"]的string; “东西”属性将会丢失。

ES2015:

如果您可以使用ES6 JavaScriptfunction,则可以使用Computed Property Names(计算属性名称)来轻松处理此问题:

 var key = 'DYNAMIC_KEY', obj = { [key]: 'ES6!' }; console.log(obj); // > { 'DYNAMIC_KEY': 'ES6!' } 

JavaScript中的关联数组与其他语言中的关联数组并不一样。 for each语句都很复杂(因为它们枚举了inheritance的原型属性)。 你可以像Pointy提到的那样在对象/关联数组上声明属性,但是对于这样的事情你应该使用push方法来使用数组:

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

不要忘记索引数组是基于零的,所以第一个元素是jsArr [0],而不是jsArr [1]。