0

我正在尝试为对象属性分配一个值,但它没有被存储。

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

小提琴

如何存储音量?

4

3 回答 3

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
于 2013-09-14T14:02:28.447 回答
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';
...
于 2013-09-14T13:52:58.120 回答
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].idsettings[players[i].id],它不是一个对象。

您应该检查 的类型settings[players[i].id],然后为其分配一些东西:

settings[players[i].id] = settings[players[i].id] || players[i].id;
于 2013-09-14T13:56:35.527 回答