什么是避免对象命名空间冲突的javascript哈希表实现?

时间:2008-09-19 16:57:33

标签: javascript hash diff adobe-indesign

首先:我正在使用一个相当模糊的javascript嵌入式实现作为Adobe InDesign CS3的脚本引擎。这种实现有时偏离“标准”javascript,因此我的问题。

我正在使用John Resig's jsdiff librarysource here)来比较两个文档之间的文本选择。 jsdiff使用vanilla对象作为关联数组,将文本中的单词映射到另一个对象。 (参见第129行的jsdiff.js中的“ns”和“os”变量。)

当文字中出现“反映”一词时,我的头痛开始了。 “reflect”是所有对象上的默认只读属性。当jsdiff尝试将关联数组的值分配给ns ['reflect']时,一切都会爆炸。

我的问题:这有什么办法吗?有没有办法在不使用明显的vanilla对象的情况下在javascript中执行哈希表?

基本规则:切换脚本引擎不是一种选择。 :)

3 个答案:

答案 0 :(得分:5)

你可能会“提出错误的问题”(正如Raymond Chen所说);而不是试图避免使用vanilla对象,尝试更改关联数组成员的命名方式。

我试图接近这个的方式:而不是有一个数组成员ns [“reflect”],改变jsdiff构建数组的方式,使成员是ns [“_ reflect”]或其他一些变体在那。

答案 1 :(得分:1)

如果您使用的JS实现支持对象的hasOwnProperty方法,则可以使用它来测试是否已为对象显式设置属性,或者属性是否从其原型继承。例如:

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

答案 2 :(得分:0)

javascript中给定的对象只是关联数组,实际上没有另一个内置的哈希解决方案。您可以通过在某些数组周围包装类来创建自己的psuedo哈希表,尽管在涉及手动工作时可能会有显着的性能损失。

只是附注,我还没有真正使用或查看过jsdiff库,因此根据提示或技巧我无法提供任何有效的见解。