На самом деле существует четвертый вариант:
var people = ['Joe', 'Sam', 'Eve'];
, поскольку ваши значения оказываются последовательными. (Конечно, вам придется добавить / вычесть один --- или просто положить undefined в качестве первого элемента).
Лично я бы пошел с вашим (1) или (3), потому что они будут быстрее всего искать кого-то по идентификатору (O log n в худшем случае). Если вам нужно найти идентификатор 3 в (2), вы можете найти его по индексу (в этом случае my (4) в порядке) или искать - O (n).
Пояснение: я говорю, что O (log n ) - худший результат, потому что, AFAIK, и реализация может принять решение использовать сбалансированное дерево вместо хеш-таблицы. Хеш-таблица была бы O (1), предполагая минимальные коллизии.
Редактировать с nickf: с тех пор я изменил пример в ОП, поэтому этот ответ может не иметь такого большого смысла. Извинения.
после редактирования
Хорошо, постредактируйте, я бы выбрал вариант (3). Это расширяемый (легко добавлять новые атрибуты), функции быстрого поиска, а также может быть повторен. Он также позволяет вам перейти от ввода обратно к ID, если вам нужно.
Опция (1) будет полезна, если (а) вам нужно сэкономить память; (б) вам никогда не нужно переходить от объекта обратно к идентификатору; (c) вы никогда не будете расширять хранимые данные (например, вы не можете добавить фамилию человека)
Вариант (2) хорош, если вам (а) необходимо сохранить порядок; (б) нужно перебрать все элементы; (c) не нужно искать элементы по id, если они не отсортированы по id (вы можете выполнить бинарный поиск в O (log n ). Обратите внимание, конечно, если вам нужно сохранить его отсортировано, тогда вы заплатите за вставку.