2008-09-19 8 views
1

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

Я использую John Resig's jsdiff library (source here), чтобы сравнить выбор текста между двумя документами. jsdiff использует ванильные объекты в качестве ассоциативных массивов для отображения слова из текста в другой объект. (См. Переменные «ns» и «os» в jsdiff.js, вокруг строки 129.)

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

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

Основные правила: Переключение сценариев не является вариантом. :)

ответ

5

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

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

+0

+1. Умная! ... :-) – paercebal 2008-09-19 17:30:47

0

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

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

1

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

if(object.hasOwnProperty('testProperty')){ 
    // do something 
}