-2

这是在节点外壳中完成的:

> 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 }
                  ]
            }
          ]
4

4 回答 4

1

您的代码按书面方式工作,但缺少您想要的功能,因为您试图将数组索引设置为一个值,而不是使用非数组 javascript 对象。请参阅下面的示例

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

这将导致

[ { '5':  [ {} ] } ]
于 2012-10-31T17:26:27.563 回答
1

这就是您实现所需结构的方式,尽管我相信您可能会找到一种更简单的方法来表示这些数据。

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

http://jsfiddle.net/jumY2/

于 2012-10-31T17:26:03.380 回答
1

这就是数组的工作方式。数组的长度由它的最高索引决定。如果给第五个位置赋值,则数组长度为 6。

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

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

拥有像这样的稀疏数组非常好,但如果你真的想要像哈希图这样的东西,你应该使用对象而不是数组。


注意:results[5]所有属性(也是数组索引,因为数组只是特殊对象)都转换为字符串,所以和之间真的没有区别results['5']

于 2012-10-31T17:53:11.440 回答
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' } }

[]在大多数情况下,您要求的s 似乎有点损坏。Javascript 对象本质上是字典,并且将它们列表与一个键/值对每个似乎增加了复杂性而没有真正的收益。例外情况是,如果您希望每个键都有一堆值,并且愿意忍受每次要查找某些内容时都必须遍历整个对列表的丑陋。

于 2012-10-31T17:23:44.510 回答