JavaScript-объект эффективен для ассоциированного массива (AKA Map)? Какие есть альтернативы? - PullRequest
1 голос
/ 12 июня 2011

Я новичок в JavaScript и в последнее время программирую на PHP, который я ищу, чтобы портировать на JavaScript. PHP имеет Map, реализованный непосредственно в своем классе контейнера Array, которого нет в языке JavaScript по умолчанию.

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

Поиск недвижимости

При доступе к свойствам объект, JavaScript будет пересекать прототип цепи вверх, пока не найдет свойство с запрошенным именем.

Когда он достигает вершины цепи - а именно Object.prototype - и до сих пор не нашел указанное свойство, вернет значение неопределенное вместо этого.

Казалось бы, Object не является эффективным решением для ассоциативных массивов, особенно когда ваш массив желаний может содержать 10 из 1000.

Какая эффективная альтернатива сопоставлению / ассоциативному массиву в JavaScript? Есть ли хорошая сторонняя библиотека, которая предлагает отличный контейнерный класс, реализованный как map / assoc. массив? Мне нужно иметь возможность легко и эффективно создавать большие многоуровневые ассоциированные массивы для различных стратегий индексации в моем коде, поэтому мне нужны оптимальные алгоритмы сортировки и поиска.

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

Ответы [ 2 ]

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

Цитата в вашем вопросе не имеет ничего общего с тем, насколько оптимизирован поиск недвижимости. Когда вы сделаете это: var x = {}, а затем x.foo, он проверит, существует ли foo. Если этого не произойдет, то он не будет «идти по цепочке» и искать в другом месте, потому что x уже является самым примитивным типом объекта.

На самом деле вы спрашиваете, насколько оптимизирован поиск строк, учитывая, что у вас есть объект. Тем не менее, проверьте это:

http://www.timdown.co.uk/jshashtable/

Это реализация хеш-таблицы в JS. Я не проверял, насколько он был оптимизирован, но в Chrome он был в 5-10 раз медленнее, чем просто использование обычных объектов JS в качестве хеш-таблицы. (Тестовый размер 10000 элементов.) Я сам написал простую хеш-таблицу JS и получил такой же результат.

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

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

Поскольку Object является самой верхней prototype цепочкой (вы не используете подобъекты с субпрототипами), цепочки для оценки нет.Таким образом, Object.prototype - единственный прототип, к которому он получит доступ для проверки свойств.Таким образом, на самом деле нет такой проблемы, как вы подразумевали в цитате.

...