5
var obj = { key: value1, key: value2}

我想迭代它并获得 (key and value1) 和 (key and value2)

如果我使用简单的循环:

for (var i in obj){
 console.log(obj[i])
}

我得到:键值2 键值2

所以 obj[i] 总是取最后一个键

4

2 回答 2

18

JS 对象中的键必须是唯一的。

会发生什么,是:

var obj = {
    key : value1
}

设置obj['key']value1

随后的声明将key : value2 覆盖您之前的声明。


您的问题的可能解决方案:

var obj = {
    key : [value1, value2]
}

for (var i in obj)
{
    if (obj[i] instanceof Array)
    {
        for (var k; k < obj[i].length; k++)
        {
            console.log(obj[i][k])
        }
    }
    else
    {
        console.log(obj[i]);
    }
}

另一个可能更优雅的解决方案是修改存储数据的方式,如下所示:

var obj = [
    { key : 'SomeKey'     , value : 'foo' },
    { key : 'SomeKey'     , value : 'bar' },
    { key : 'SomeOtherKey', value : 'baz' }
];

这显然允许具有相同键的多个条目。查询可以按照以下方式在某处进行:

values = [];
for (var i = 0; i < obj.length; i++)
{
    if (obj[i].key === 'SomeKey')
    {
        values.push(obj[i].value);
    }
}

console.log(values);
于 2012-09-24T08:43:06.270 回答
3

这是不可能的。如声明中所述:

var obj = { key: value1, key: value2}

Initially obj.key is set as value1, in the second assignment value1 is rewritten with value2, So, obj.key is now value2.
So you cannot access the initial value.

于 2012-09-24T08:45:15.857 回答