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

IT技术 javascript object
2021-02-07 14:14:14

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

jsObj = {};

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

我该怎么做才能制作这样的动态密钥?

2个回答

方括号:

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

在 JavaScript 中,所有数组都是对象,但并非所有对象都是数组。主要区别(并且很难用直接的 JavaScript 和普通对象模仿)是数组实例维护length属性,以便它反映名称为数字的属性的数字值,当转换为数字时,它的值, 是所有此类属性中最大的。这听起来很奇怪,但这只是意味着给定一个数组实例,名称如"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"]; “某物”财产将丢失。

ES2015:

如果您能够使用 ES6 JavaScript 功能,您可以使用计算属性名称来非常轻松地处理此问题:

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

console.log(obj);
// > { 'DYNAMIC_KEY': 'ES6!' }
if(i == -1) { var key = "asd"; var val = data.gname; connect_clients.push({[key]:val}); 当我在 ({[key]) 中运行 node.js 错误时出现错误,不知道为什么
2021-03-13 14:14:14
@ujwaldhakal 我不明白那个评论,抱歉。
2021-03-14 14:14:14
@ujwaldhakal 什么版本的 Node.js?您必须使用支持 ES2015 功能的版本。
2021-03-19 14:14:14
@ujwaldhakal 如果您遇到困难,也许您应该问一个新问题。
2021-03-26 14:14:14
在 node js 中使用时获取 dnt 知道为什么
2021-04-10 14:14:14

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

jsArr = []; 

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

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