obj[key].newKey = val is not stored



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

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';
...

最新更新