我正在尝试为对象属性赋值,但不存储它。
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
如何存储音量?
答案 0 :(得分:1)
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
答案 1 :(得分:0)
看起来settings
是一个数组,这意味着您应该只使用基于0的整数作为键。在此示例中,您尝试以下操作:
settings[players[i].id]
这只有在players[i].id
是一个整数并且所有索引从0开始时才能工作。依次类推。
如果要存储任意键,请不要将settings
声明为数组。将其声明为对象:
var settings = { };
现在您可以存储任意属性:
settings['foo'] = 'bar';
但是如果你把它声明为一个数组:
var settings = [ ];
然后你只能使用:
settings[0] = 'foo';
settings[1] = 'bar';
...
答案 2 :(得分:0)
如果向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;
的类型,然后为其指定一些内容:
{{1}}