我正在寻找一种简单而有效的方法,可以在某种字典中通过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"}]
这些数组索引是否实际分配并使用内存,或者这是一个概念视图? 另外,我应该这样做吗?
答案 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中那样将数组内存等分配给数组中最大的块。