我如何创建一个动态键被添加到一个JavaScript对象变量

我正在尝试类似的东西,但这个例子不起作用。

jsObj = {};


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

我怎么做一个这样的动态键呢?

420692 次浏览

方括号:

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

在JavaScript中,所有数组都是对象,但并不是所有对象都是数组。主要的区别(这一点很难用直接的JavaScript和普通对象来模仿)是数组实例维护length属性,这样它就反映了属性的数字值的一加,该属性的名称是numeric,并且当转换为数字时,其值是所有此类属性中最大的。这听起来很奇怪,但这只是意味着给定一个数组实例,具有"0""5""207"等名称的属性都被特殊对待,因为它们的存在决定了length的值。而且,最重要的是,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,其他方法完全相同。

有人可能会认为,因为length行为有点方便,所以不妨将所有对象作为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!' }

JavaScript中的关联数组与其他语言中的关联数组的工作原理并不相同。for each语句是复杂的(因为它们枚举继承的原型属性)。你可以像Pointy提到的那样在对象/关联数组上声明属性,但实际上对于这种事情,你应该使用带有push方法的数组:

jsArr = [];


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

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