正如您所发现的,您不应该为此使用数组,而应该使用对象。但您应该更进一步,在顶层也使用一个对象。自从你的2015073012
value 将用作字符串,最好从一开始就将其设置为字符串:
var results = {};
results.test = {};
results.test['2015073012'] = someObject;
or:
var results = {};
results['test'] = {};
results['test']['2015073012'] = someObject;
现在您在任何 JavaScript 引擎中都不会有任何问题。
(顺便说一句,我把名字从resultArr
to results
所以这个名字听起来并不像是一个数组。)
JavaScript 数组适用于有连续条目的情况,例如array[0]
, array[1]
, array[2]
等等。当你有任意字符串或任意大的数字作为键时,不要使用数组,而使用对象。
不要被其他语言所迷惑,例如 PHP,它们只有一个array
类型既充当顺序0,1,2,3,...
数组和键值对的字典。 JavaScript 同时具有数组和对象:对于顺序情况使用数组,对于键值情况使用对象。
回到你的问题,为什么did此代码中断:
resultArr = [];
resultArr["test"] = [];
resultArr["test"][2015073012] = someObject;
一种可能的解释是,当您为[2015073012]
数组索引:它创建一个数组2,015,073,013条目(比您给出的值大一,因为数组索引从 0 开始)。就这样结束了二十亿数组中的条目!您可能会看到这会如何导致问题 - 但这肯定不是您想要的。
其他引擎可能会意识到这是一个大得离谱的数字,并将其视为字符串而不是数字,就好像您首先使用对象而不是数组一样。 (JavaScript 数组是also一个对象,可以有键值对以及数字索引。)
事实上,我祈祷并在最新版本的 Chrome 的 JavaScript 控制台中尝试了这一点,并且没有任何问题:
a = [];
a[2015073012] = {};
但你就没那么幸运了。无论如何,您应该始终使用对象而不是数组来进行此类用途,以确保将它们视为键值对,而不是创建包含大部分为空元素的巨大数组。