在javascript中使用对象字典的内存

时间:2011-01-21 10:27:45

标签: javascript arrays memory dictionary

我正在寻找一种简单而有效的方法,可以在某种字典中通过ID稍后调用业务对象。我有这个方法工作,但它似乎可能不必要地使用大量的内存。

var objects = [{ ID: 20, Description: 'Item 1'},
               { ID: 40, Description: 'Item 2'},
               { ID: 60, Description: 'Item 3'}];

var objectsByID = [];
$.each(objects, function (index, o) {
        objectsByID[o.ID] = o;
});

var itemID40 = objectsByID[40];

Firebug告诉我objectsByID在已添加的ID号之间有未定义的数组元素,如下所示:

[undefined, ... ,
Object { ID=20, Description="Item 1"}, ... ,
Object { ID=40, Description="Item 2"}, ... ,
Object { ID=60, Description="Item 3"}]

这些数组索引是否实际分配并使用内存,或者这是一个概念视图? 另外,我应该这样做吗?

2 个答案:

答案 0 :(得分:3)

JavaScript数组稀疏,所以不,你不会占用额外的内存。但是,控制台显示它的原因是,length属性将等于最高指数+1。


一些解释:

所有数组索引都转换为字符串,并且与对象属性完全相同。您可以在控制台中执行以下测试:

var a = [];
a[100] = "hello";

a["100"]; // "hello"
a.hasOwnProperty("100"); // true
a.hasOwnProperty("0"); // false

要表明此与声明的属性不同,但是“未定义”

a[0] = undefined;
a.hasOwnProperty("0"); // true

答案 1 :(得分:1)

var objects = {
    "20": { ID: 20, Description: "Item 1" }
    "40": { ID: 40, Description: "Item 2" }
}

不要使用数组。使用对象并复制密钥。您仍然可以将其视为一个数组但是使用数组它将创建空格1-19这里您只有两个键恰好被称为“20”和“40”。

当然你无论如何都可以使用数组,因为在内存使用方面与一堆未定义的对象并不重要。我们不像在C中那样将数组内存等分配给数组中最大的块。