如何创建要添加到 JavaScript 对象变量的动态键 [重复]

Posted

技术标签:

【中文标题】如何创建要添加到 JavaScript 对象变量的动态键 [重复]【英文标题】:How do I create a dynamic key to be added to a JavaScript object variable [duplicate] 【发布时间】:2011-01-28 14:24:48 【问题描述】:

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

jsObj = ;

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

如何制作这样的动态键?

【问题讨论】:

【参考方案1】:

方括号:

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

javascript 中,所有数组都是对象,但并非所有对象都是数组。主要区别(并且很难用直接的 JavaScript 和普通对象模仿)是数组实例维护 length 属性,以便它反映名称为数字的属性的数值加上转换时的数值到一个数字,是所有此类属性中最大的一个。这听起来很奇怪,但这只是意味着给定一个数组实例,名称为"0""5""207" 等的属性都被特殊处理,因为它们的存在决定了@987654327 的值@。而且,最重要的是,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 的行为有点方便,您不妨将 all 对象作为 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 特性,你可以使用Computed Property Names 来轻松处理这个问题:

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

console.log(obj);
// >  'DYNAMIC_KEY': 'ES6!' 

【讨论】:

在 node js 中使用时得到 dnt 知道为什么 @ujwaldhakal 我不明白那个评论,抱歉。 if(i == -1) var key = "asd"; var val = data.gname; connect_clients.push([key]:val);当我在 ([key]) 中运行 node.js 错误时出现错误,不知道为什么 @ujwaldhakal 如果你有困难,也许你应该问一个新问题。 非常清晰实用的答案。当我尝试在新数组的索引 21 处设置新值时,我从索引 0 到 20 中得到了奇怪的未定义值。很困惑,通过这个答案,我理解了为什么会出现这种行为,因此我决定使用对象而不是数组。【参考方案2】:

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

jsArr = []; 

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

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

【讨论】:

以上是关于如何创建要添加到 JavaScript 对象变量的动态键 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何查看javascript object对象的所拥有的属性值

如何查看javascript object对象的所拥有的属性值

如何使用JavaScript中的ActiveXObject 对象

为啥在 JavaScript 中将全局变量添加到窗口对象?

如何使用变量创建具有索引和值的 Javascript 对象?

JQuery 插件,Javascript - 如何仅为 JQuery 插件全局变量或 json 对象创建并在函数级别更改此(变量、对象)