obj [key] .newKey = val未存储

时间:2013-09-14 13:48:33

标签: javascript object

我正在尝试为对象属性赋值,但不存储它。

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

Fiddle

如何存储音量?

3 个答案:

答案 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}}