4

如何在 javascript 中使用数据项初始化其索引分散在整个整数范围内的字符串数组(大小<100 项)。

如果我这样做:

array1 = ["string1","string2","string3","string4"];

然后我得到长度为 4 的数组,索引范围为 0 到 3

但在我的情况下,我想保留自己的索引,以便可以将数组用作高性能 int-string 哈希表。

我最好寻找单个语句初始化。

数组的项目应该可以像这样访问:array1[23454]

从评论更新

我仅限于将数组初始化为单个语句,因为动态准备的数组初始化字符串是从服务器端附加的,如下所示:var array = <string from server here>

4

4 回答 4

2

在分配给它之前,您不必预先定义数组的大小。例如:

var _array = [];
    _array[0] = "foo";
    _array[1000] = "bar"; // _array.length => 1001 

_array[1] //undefined

在分配给它们之前无需初始化适当数量的数组元素。

更新

已经指出,您可以使用对象而不是数组。但是,如果您想利用数组方法,那么这仍然是可能的。让我给你举个例子:

var obj = {
    0: 15,
    1: 10,
    2: 5,
    length: 3
};

如果对象包含长度属性,则可以将其视为类似数组的对象。虽然您不能直接从这些对象调用数组方法,但您可以使用数组方法。

Array.prototype.join.call( obj ); // 15,10,5

事实上,使用 ECMAScript 5 的 map 函数,您可以轻松地将上述对象转换为数组。

var _array = Array.prototype.map.call( obj, function( x ) { return x; } );

地图功能并非在所有浏览器中都存在,但如果不存在,您可以使用以下功能。

Array.map = Array.map || function(a, f, thisArg) {
    return Array.prototype.map.call(a, f, thisArg); 
}
于 2012-10-25T16:27:34.300 回答
2

要创建具有一定数量索引的数组,您可以使用

// Creates an array with 12 indexes
var myArray = new Array(12);

由于其数组的工作方式,在 javascript 中不需要这样做。数组没有上限。如果您尝试引用数组中不存在的项目索引,undefined则返回但不会引发错误

要创建具有规定索引的数组,您可以使用类似的东西,array['index'] = value尽管这会迫使您使用多个语句。Javascript 没有数组初始化器来允许您在单个语句中指定索引和值,尽管您可以创建一个函数来执行此操作

function indexArray(param) {
    var a = [], i;
    for (i=0; i<param.length; i+=1) {
        a[param[i].index] = param[i].value;
    }
    return a;
}

var myArray = indexArray([
    { index: 123456, value : "bananas" },
    { index: 12, value : "grapes" },
    { index: 564, value : "monkeys" }
]);
于 2012-10-25T16:13:20.640 回答
2
var array1 = []
array1[23454] = 2

只是这样做应该没问题。没有像 java 那样为 javascript 设置数组大小。

如果你真的想在一个语句中完成这一切,你可以像这样创建一个对象:

var object1 = {
    "23454":2,
    "123":1,
    "50":3
};

然后像这样检索数字:

object1["23454"]  //2

不过我真的不推荐这个。数组方法是一种更简洁的方法,即使它需要多行,因为它不需要字符串转换。我不太了解这些是如何在浏览器中实现的,无法评论性能影响。

更新

由于 1 行要求是基于传递给服务器的东西,我建议以以下形式将 JSON 对象传递给服务器:

"{"23454":2,"123":1,"50":3}"

然后这段代码会将其解析为一个对象:

var object1 = JSON.parse(jsonstringfromserver);

如果您愿意,您可以随时通过使用 for in 循环枚举属性将其转换为数组:

var array1 = []
for ( num in object1){
    array1[num] = object1[num];

这可能是不必要的,因为 object1[123] 已经返回 1。只有在计划执行特定于数组的操作时才需要它。

于 2012-10-25T16:20:30.153 回答
0

您可以通过以下方式对 Object 执行您想要的操作:

var o = {23454: 'aaaa', 23473: 'bbb'};

您将丢失数组方法/字段,例如长度,但您将获得您所说的您正在寻找的内容,并且您将能够轻松添加/删除成员。

于 2012-10-25T16:30:22.057 回答