为什么我不能在 javascript 对象中分配一串数字作为键?



这是在节点shell中完成的:

> results = []
[]
> num = 5
5
> results[num] = []
[]
> results
[ , , , , , [] ]
>

,即使我尝试串起数字:

> results = []
[]
> num = 5
5
> results[num.toString()] = []
[]
> results
[ , , , , , [] ]
> results['5'] = []
[]
> results
[ , , , , , [] ]
>

JavaScript似乎将字符串解释为对象的定义中的数字?

我希望结果看起来像这样:

results = [ { '5' : [
                   { key : value },
                   { key2 : value }
                  ]
            }
          ]

这就是您将如何达到所需结构的方式,尽管我敢肯定,您可能会找到一种更简单的表示该数据的方法。

var results = [];
results.push({
    '5': []
});
results[0]['5'].push({
    key: value
});
results[0]['5'].push({
    key2: value2
});

http://jsfiddle.net/jumy2/

您的代码正常工作,但缺少您的预期功能,因为您试图将数组索引设置为值,而不是使用非阵列JavaScript对象。示例

results = [];
results[0] = { '5': [ { /* ... * / } ] };

这将导致

[ { '5':  [ {} ] } ]

这就是数组的工作方式。阵列的长度由其最高索引决定。如果将值分配给第五位,则数组长度为6。

您看到的输出(即[ , , , , , [] ])只是控制台输出数组的方式。

它仍然只有一个分配的元素,您可以查看是否执行console.dir(results)

具有这样的稀疏阵列是完全可以的,尽管如果您实际上想要诸如hashmap之类的东西,则应使用对象而不是数组。


注意:所有属性(也是数组索引,因为数组只是特殊对象)被转换为字符串,因此results[5]results['5']之间实际上没有区别。

您不仅可以使用任何形式的对象。[]是一个数组,具有某些神奇的属性 - 其中之一是非阴性整数键扩展了数组。即使它们是字符串,这也不重要 - 无论如何,所有对象键都是字符串,数组仍然是对象。

如果您不希望数组对整数键的特殊处理,请尝试使用{},而不是[]

> results = {}
{}
> results[5] = []
[]
> results
{ '5': [] }

课程,如果您想使该值成为一堆键/值对,则可以考虑说results[5] = {}

> results = {}
{}
> results[5] = {}
{}
> results[5]['key'] = 'value'
'value'
> results
{ '5': { key: 'value' } }
> results[5]['key2'] = 'value'
'value'
> results
{ '5': { key: 'value', key2: 'value' } }

在大多数情况下,您要要求的[] s似乎有点损坏。JavaScript对象是其本质上的字典,其中包含一个键/值对的列表似乎增加了复杂性而没有真正的增益。例外是,如果您想每个键都有一堆值愿意忍受每次想找到某些东西时必须循环整个对列表的丑陋。

最新更新