我正在尝试为对象属性分配一个值,但它没有存储。
for (var i = 0; i < players.length; i++) {
if (players[i].volume < 1) players[i].volume = (Math.round((players[i].volume + 0.1) * 10) / 10); // JS math error fix
settings[players[i].id] = settings[players[i].id] || players[i].id;
settings[players[i].id].volume = players[i].volume;
console.log(settings[players[i].id] + " " + players[i].id + " " + players[i].volume + " " + settings[players[i].id].volume);
}
settings[players[i].id].volume
== undefined
小提琴
如何存储卷?
>settings
是一个对象,所以settings[players[i].id]
是该对象的属性,名称由players[i].id
.然后,将此属性设置为等于字符串:
settings[players[i].id] = settings[players[i].id] || players[i].id;
然后尝试向其添加属性:
settings[players[i].id].volume = players[i].volume;
这不起作用,因为它是一个字符串。没有错误,因为浏览器会暂时将字符串包装在对象包装器中,然后立即忽略该包装器。您正在执行类似操作:
var string = "something";
string.prop = 10; // won't throw error
console.log(string.prop); // undefined
如果你动态地将一些属性添加到settings
,你应该首先初始化它。可以使用空对象文本完成初始化,如下所示:
settings[player[i].id] = {};
settings[player[i].id].volume = player[i].volume;
你写道:
settings[players[i].id] = settings[players[i].id] || players[i].id;
可以将players[i].id
分配给不是对象的settings[players[i].id]
。
您应该检查settings[players[i].id]
的类型,然后为其分配一些内容:
settings[players[i].id] = settings[players[i].id] || players[i].id;
看起来settings
是一个数组,这意味着您应该只使用 0 个从 0 开始的整数作为键。在此示例中,您将尝试以下操作:
settings[players[i].id]
仅当 players[i].id
是整数并且所有索引都从 0 开始依此类推时,这才有效。
如果要存储任意键,请不要将settings
声明为数组。将其声明为对象:
var settings = { };
现在您可以存储任意属性:
settings['foo'] = 'bar';
但是如果你把它声明为一个数组:
var settings = [ ];
那么你只能使用:
settings[0] = 'foo';
settings[1] = 'bar';
...