2012-10-31 27 views
-2

这是在节点壳做:为什么我不能在JavaScript对象中将一串数字指定为键?

> 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 } 
        ] 
      } 
      ] 
+0

你可以这样做,你的例子有什么问题?只有当指定一个空数组到一个空数组的索引时,你不能期望得到一个由一个数组组成的对象的数组。 – Bergi

+0

请参见[JavaScript“关联数组”被认为是有害的](http://andrewdupont.net/2006/ 5月18日/ JavaScript的相联阵列考虑的有害/)。 –

回答

0

你不能仅仅用任何类型的对象的工作。 []是一个数组,它具有某些神奇的属性 - 其中之一就是非负整型查找键可以扩展数组。即使它们是字符串,也没关系 - 无论如何,所有的对象键都是字符串,数组仍然是对象。

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

> 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' } } 

[]是你要问的似乎在大多数情况下有点破。 Javascript对象本身就是字典,并且用一个键/值对列出它们似乎会增加复杂性而没有真正的收益。例外情况是,如果你想为每个键有一堆值愿意忍受每次你想找到某些东西时必须循环遍历整个列表对的额外丑陋。

+0

谢谢,这正是我正在寻找的。不知道为什么原来的问题被拒绝投票......新的语言是全部。 –

1

这就是你将如何实现所需的结构,但我相信你可能会找到一种更简单的方法来表示这些数据。

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

http://jsfiddle.net/jumY2/

1

您的代码工作作为写,但缺少您想要的功能,因为你想设置一个数组索引值,而不是使用非数组JavaScript对象..见下文一个例子

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

这将导致

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

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

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

它仍然只有一个元素分配,你可以看到如果你做console.dir(results)

像这样稀疏数组是非常好的,但如果你真的想要像hashmap一样的东西,你应该使用一个对象而不是数组。


注:所有属性(也数组索引,因为数组仅仅是特殊的对象)转换为字符串,所以真的results[5]results['5']没有什么区别。

相关问题