Использование памяти объектного словаря в javascript - PullRequest
0 голосов
/ 21 января 2011

Я ищу простой и эффективный способ создания бизнес-объектов, которые позже будут вызываться по идентификатору в каком-то словаре.У меня есть этот метод работает, но, похоже, он может излишне использовать много памяти.

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 ]

3 голосов
/ 21 января 2011

Массивы JavaScript немногочисленны, так что нет, вы не тратите дополнительную память таким образом.Однако недостатком и причиной того, что консоли отображают его так, является то, что свойство length будет равно вашему наибольшему индексу + 1.


Некоторое объяснение:

ВсеИндексы массива преобразуются в строки и обрабатываются точно так же, как свойства объекта.Вы можете выполнить следующий тест в консоли:

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

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

Чтобы показать, что это не то же самое, что объявленное свойство, но 'undefined' :

a[0] = undefined;
a.hasOwnProperty("0"); // true
1 голос
/ 21 января 2011
var objects = {
    "20": { ID: 20, Description: "Item 1" }
    "40": { ID: 40, Description: "Item 2" }
}

Не используйте массив. Используйте объект и продублируйте ключ. Вы все еще можете обращаться с ним как с массивом, но с массивом он будет создавать пробелы 1-19, здесь у вас просто есть два ключа, которые называются «20» и «40».

Конечно, вы в любом случае можете просто использовать массивы, потому что это не имеет большого значения с точки зрения использования памяти с кучей неопределенных объектов. Мы не выделяем блоки эквивланта памяти для самого большого блока в массиве, как мы делаем в C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...