2011-01-21 2 views
0

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

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 имеет неопределенные элементы массива в-между идентификационными номерами, которые были добавлены, как так:

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

ли эти индексы массива фактически назначены и использование памяти, или это концептуальный взгляд?
Кроме того, должен ли я это делать?

+0

$ .each is jQuery? –

+0

Да, используется здесь, чтобы упростить пример кода. Этот вопрос не относится конкретно к jQuery, я приму ответ, который тоже не использует его. – Codesleuth

ответ

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

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

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

+0

Для этого мне пришлось бы отказаться от использования JavaScriptSerializer, но это похоже на самый прямой подход. Благодаря! – Codesleuth

+0

Вы должны иметь возможность сериализовать объект C# на codebehind как 'IDictionary' с ключом, значения (20, BusinessObject) с помощью JavaScriptSerializer. – Raynos

+0

Это работает как шарм! Я должен был объявить словарь «Словарь <строка, объект>», потому что он должен сериализовать ключ как имя свойства (строка), и я использовал перевод .Select() 'с моего бизнес-объекта на анонимный тип, чтобы убедитесь, что я не сериализую все, что мне не нужно. Отличный ответ, хотя технически @ Ответ Box9 - более подходящий ответ на мой вопрос, этот ответ - тот, который я буду использовать. Ура! – Codesleuth

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 
+0

Я считаю, что по соображениям производительности большинство реализаций JS предполагают, что обычный случай использования представляет собой компактный массив и реализуется как таковой. – spender

+0

@spender, тогда это была бы некорректная реализация, и большинство реализаций JS (т. Е. Браузеров) * не реализовали его как таковой. Попробуйте код, который я опубликовал, чтобы убедиться в этом сами. –

+0

ОК. После небольшого тестирования я подхожу к вашему POV. Например, я ожидал следующий фрагмент кода, чтобы убить мою машину, если мои утверждения верны: var a = []; а [1000000000] = 1; оповещение (а [+1000000000]); – spender

Смежные вопросы