Javascript: многомерный объект - PullRequest
8 голосов
/ 11 июля 2011

Я хочу создать объект, начиная с чего-то вроде:

var map = {};

Затем я хочу добавить элементы с помощью этой функции:

add = function(integerA, objectB) {
    map[objectB.type][integerA] = objectB;
}

Итак, это случайныйПример структуры объекта, которую я хочу достичь:

map = {
    'SomeType' : { 0 : 'obj', 2 : 'obj', 3 : 'obj' },
    'OtherType' : { 0 : 'obj', 5 : 'obj' },
};

Теперь моя проблема.Я не могу сделать map[objectB.type][integerA] = objectB;, потому что map[objectB.type] не определен.Я мог бы решить это, проверив, существует ли map[objectB.type] с помощью оператора if, и создать map[objectB.type] = {}; при необходимости.

В противном случае я мог бы предварительно загрузить все типы объектов.Однако я бы предпочел не делать этого.

Мой вопрос: есть ли способ, которым я могу создать объект «на лету», не проверяя, существует ли тип каждый раз, когда я хочу вызватьadd функция или предварительная загрузка всех типов?

Важно, чтобы моя функция добавления была настолько быстрой, насколько это возможно, и чтобы объект карты был корректным, потому что мне нужно много читать и писать внебольшое количество времени (это анимация / игровое приложение).

Ответы [ 3 ]

9 голосов
/ 11 июля 2011

Нет, другого способа создания объектов на лету нет.Только проверяйте существование каждый раз:

add = function(integerA, objectB) {
    if (!map[objectB.type]) {
        map[objectB.type] = {};        
    }
    map[objectB.type][integerA] = objectB;
}

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

3 голосов
/ 11 июля 2011

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

add = function(integerA, objectB) {
    var key = objectB.type + '-' + integerA;
    map[key] = objectB;
}
3 голосов
/ 11 июля 2011

Вы можете использовать логическое сочетание ИЛИ (которое позволяет избежать хотя бы явного if).Хотя это может быть не так читаемо:

var data = map[objectB.type] || (map[objectB.type] = {});
data[integerA] = objectB;

Это работает, потому что присвоение фактически возвращает назначенное значение, а выражение OR возвращает первое значение, которое оценивается как true.

Я не думаю, что использование if оказывает какое-либо влияние на производительность (хотя в моем ответе это может быть даже «медленнее»).

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