Лучшая практика для заказа коллекции пар ключ / значение в JavaScript? - PullRequest
1 голос
/ 20 июня 2011

Каков эффективный (и удобный для пользователя) способ реализовать следующее в javascript / jQuery?

В зависимости от mime-типа файла должен быть выполнен обратный вызов. Обратный вызов определяется разработчиком путем предоставления описания типа mime с необязательными подстановочными знаками (например, text / javascript, text / *, * / *) и самим обратным вызовом. Должен быть определенный порядок, в котором объявленные типы сопоставляются с данным mime-типом файла. Например, текст / обычный текст должен иметь более высокий приоритет, чем текст /*.

Вот несколько идей:

Использование простого объекта

var handler = {
 'text/javascript' : callback0,
 'text/*' : callback1
}

Это будет наиболее интуитивным решением, но порядок будет , не гарантируется .

Ведение двух списков

<code>var order = ['text/javascript', 'text/*'];
var handler = [callback0, callback1];

Это будет трудно поддерживать, если существует более двух или трех типов, и вы используете анонимные функции в качестве обратных вызовов.

Добавление индекса путем переноса обратного вызова в объект

<code>var handler = {
  'text/javascript' : {index: 0, callback0},
  'text/*' : {index: 1, callback1}
};

... изменить тысячи свойств индекса при вставке элемента в начале.

Использование массива массивов

<code>var handler = [
  ['text/javascript', callback0],
  ['text/*', callback1]
];

Это может быть более удобным для пользователя, чем другие, но нет прямого доступа для известных типов MIME без итерации по элементам (это было бы хорошо иметь).

Итак, есть несколько способов сделать то, что я хочу, но каков будет правильный способ (и почему)? Может быть, у кого-то есть шаблон?

Лучший, Hacksteak

Ответы [ 2 ]

2 голосов
/ 20 июня 2011

Я бы использовал решение «простой объект» И массив заказов из решения «Поддерживать два списка».

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

РЕДАКТИРОВАТЬ, ЧТОБЫ ОТВЕТИТЬ НА КОММЕНТАРИЙ

Я согласен с вашим комментарием. Я хотел бы сделать что-то вроде этого, чтобы сделать это только одна переменная:

var handlers = {
  handler: {
    'text/javascript': callback0,
    'text/*': callback1
  },
  order: ["text/javascript", "text/*"]
};

Хотя я бы выбрал лучшие имена для переменной handlers и / или свойства handlers.handler.

ДРУГОЙ ОТВЕТ НА ДРУГОЙ КОММЕНТАРИЙ

Может быть, вам следует просто изменить handlers.handler и handlers.order один тип пантомимы за один раз:

var handlers = { handler: {}, order: [] }; // initialize as empty

// add 'text/javascript' mime type
handlers['text/javascript'] = callback0;
handlers.order.push('text/javascript');

// add 'text/*' mime type
handlers['text/*'] = callback1;
handlers.order.push('text/*');

Этот метод немного повторяется, но в будущем его будет легко поддерживать. Если хотите, вы можете написать функцию, которая добавляет новое свойство к handlers.handler и добавляет новый mime-тип к handlers.order.

1 голос
/ 20 июня 2011

Похоже, что упорядочение по объектам происходит в порядке вставки у большинства поставщиков, за исключением V8, что верно, за исключением числовых индексов.См. Ссылки ниже.

Я, вероятно, не буду делать петли.Я бы, вероятно, сделал что-то вроде этого:

var handler = {
    text: {
        javascript: callback0,
        '*': callback1
    },
    '*' : {
        '*': callback3
    }
};
var mime = 'whatevs/whatevs'.split('/');
var callback = handler[mime[0]][mime[1]] || handler['*']['*'];
callback();

Ссылки

  1. Итерации свойств объекта JavaScript и массивов с for..in, когда упорядочение важно
  2. http://code.google.com/p/v8/issues/detail?id=164
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...