Что такое реализация хеш-таблицы javascript, которая позволяет избежать коллизий пространства имен объектов? - PullRequest
1 голос
/ 19 сентября 2008

Прежде всего: я использую довольно туманную реализацию javascript, встроенную в качестве механизма сценариев для Adobe InDesign CS3. Эта реализация иногда отличается от «стандартного» JavaScript, поэтому моя проблема.

Я использую библиотеку Джона Резига Джона ( источник здесь ), чтобы сравнить выделенные фрагменты текста между двумя документами. jsdiff использует ванильные объекты в качестве ассоциативных массивов для сопоставления слова из текста с другим объектом. (См. Переменные "ns" и "os" в jsdiff.js, около строки 129.)

Мои головные боли начинаются, когда в тексте появляется слово «отражать». «отражение» - это свойство по умолчанию, только для чтения для всех объектов. Когда jsdiff пытается присвоить значение в ассоциативном массиве ns ['отражает'], все взрывается.

Мой вопрос: есть ли способ обойти это? Есть ли способ сделать хеш-таблицу в JavaScript без использования очевидного объекта vanilla?

Основные правила: переключение скриптовых движков не вариант. :)

Ответы [ 3 ]

5 голосов
/ 19 сентября 2008

Возможно, вы «задаете неправильный вопрос» (как сказал бы Раймонд Чен); вместо того, чтобы избегать использования ванильных объектов, попробуйте изменить способ именования членов ассоциативного массива.

Способ, которым я бы попытался подойти к этому: вместо того, чтобы быть членом массива ns ["отражает"], измените способ, которым jsdiff создает массивы так, чтобы этот член был ns ["_ отражает"] или какой-либо другой вариант на этом.

1 голос
/ 19 сентября 2008

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

if(object.hasOwnProperty('testProperty')){
     // do something
}
0 голосов
/ 19 сентября 2008

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

Просто примечание, которое я на самом деле не использовал и не просматривал в библиотеке jsdiff, так что я не могу предложить какой-либо достоверной информации по советам или рекомендациям.

...