В этом случае имеет значение размер массива в javascript? - PullRequest
6 голосов
/ 22 сентября 2009

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

Идентификаторы из конкретной базы данных могут начинаться с любого числа, например, от 80123 до 80223, для этой конкретной страницы данных.

поэтому первая запись в массиве будет выглядеть как arr [80123].

Теперь, когда я проверяю длину массива, он показывает мне 80123! Несмотря на то, что в нем всего 1 элемент, я подумал об использовании ассоциативных или индексированных по символам массивов, но в них отсутствуют некоторые базовые операции сортировки, которые мне понадобятся.

Теперь мой вопрос: «Сколько памяти будет фактически использовать массив, если в нем всего 1 элемент, а длина массива 80123?»

Подробнее ...

Базовый номер постоянно меняется. 80123 является лишь примером.

код, который я использую, выглядит следующим образом:

function ToggleAction(actionButtonID, action) 
    {
        var extractedID = ExtractNumericIdFromTag(actionButtonID);
        var arrayIndexer = extractedID; // Can update this to make array associative

        if(actionItems[arrayIndexer] == null)
        {
            actionItems[arrayIndexer] 
                = new ActionItem(extractedID, action);
        }
        else
        {
            var ai = actionItems[arrayIndexer];
            ai.action = action;
        }
    }

Ответы [ 6 ]

6 голосов
/ 22 сентября 2009

Ваш код не выделяет столько памяти, так что вам не нужно об этом беспокоиться. Массивы Javascript достаточно умны. Тем не менее, я все еще думаю, что вы должны использовать объект вместо массива в этом случае ...

var num = 80123;
var obj = {};
obj[num] = { Name: "Josh" };

alert(obj[80123].Name);
3 голосов
/ 22 сентября 2009

Массивы в Javascript - это просто хэши с несколькими особыми свойствами (главным образом, свойство "length" всегда будет возвращать на единицу больше, чем самый высокий целочисленный ключ).

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

1 голос
/ 22 сентября 2009

Попробуйте запустить следующий код в Firebug:

var a = [];
a[663] = "a";
a.length == 664;

это возвращает

true

Если вы попробуете

console.log(a)

вы получите:

[undefined, undefined, undefined,  ...... , undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "a"]

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

Я думаю, что вы действительно хотите использовать простую карту в стиле Объекта, например:

var a = {};
a[664] = "a";
a[323] = "b";
a

, что дает:

Object 664=a 323=b

, что гораздо лучше подходит для отображения ассоциаций id-> object.

Если вам нужно выполнить итерацию по этому объекту позже, чтобы посетить все объекты, используйте следующий код:

for(var id in a){
  if(a.hasOwnProperty(id)){
    console.log("id:",id," object:",a[id]);
  }
}
0 голосов
/ 22 сентября 2009

Этот вопрос уже упоминался ранее:

Что занимает меньше памяти: массив Javascript или объект Javascript?

Теоретически, в Javascript, Массив IS Объект. Единственное, что изменяется (в памяти) в массиве, это свойство .length. Он покажет следующий по величине индекс массива, но это не значит, что на самом деле в массиве выделено столько элементов.

0 голосов
/ 22 сентября 2009

Я не уверен, как ведут себя массивы js, но я думаю, что вы здесь в безопасности.

На случай, если это не так, я думаю, вы можете рассмотреть возможность изменения индекса массива на основе минимального значения id (80123 в вашем примере), чтобы индекс массива начинался с нуля.

index = id - minID;

Это может потребовать изменений в коде во многих других местах, так что делайте это, только если это абсолютно необходимо.

0 голосов
/ 22 сентября 2009

Как вы определяете свой массив? Если вы используете объект Array, у браузера должно быть несколько аргументов для интерпретации аргументов как значений, а не длины массива. Я всегда стараюсь использовать синтаксис литерального массива: a = [80123]; или a = [80123,80124];

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