如何创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]。