初始化索引分散在整数范围内的数组

时间:2012-10-25 16:11:04

标签: javascript jquery

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

如果我喜欢这样:

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

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

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

我最好注意单个语句初始化。

数组的项目应该是这样的:array1[23454]

从评论更新

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

4 个答案:

答案 0 :(得分:2)

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

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

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

要创建具有已删除索引的数组,您可以使用array['index'] = value之类的内容,但这会强制您使用多个语句。 Javascript没有数组initalizer,允许您在单个语句中指定索引和值,尽管您可以创建一个函数来执行此操作

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" }
]);

答案 1 :(得分:2)

var array1 = []
array1[23454] = 2

这样做应该没问题。 javascript的设置数组大小与java的方式不同。

如果你真的想在一个语句中完成所有这些,你可以改为创建一个对象:

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 for循环来将其转换为数组:

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

这可能是不必要的,因为object1 [123]已经返回1.如果你计划进行特定于数组的操作,你只需要这个。

答案 2 :(得分:1)

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

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); 
}

答案 3 :(得分:0)

您可以通过以下方式使用Object执行所需操作:

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

您将丢失数组方法/字段,例如长度,但你会得到你所说的你想要的,你将能够轻松地添加/删除成员。