【问题标题】:What is a javascript hash table implementation that avoids object namespace collisions?什么是避免对象命名空间冲突的 javascript 哈希表实现?
【发布时间】:2010-09-11 08:19:31
【问题描述】:

首先:我使用了一个相当晦涩的嵌入 javascript 实现作为 Adob​​e InDesign CS3 的脚本引擎。此实现有时与“标准”javascript 不同,因此是我的问题。

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

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

我的问题:有没有办法解决这个问题?有没有办法在 javascript 中做一个哈希表而不使用明显的 vanilla 对象?

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

【问题讨论】:

    标签: javascript hash diff adobe-indesign


    【解决方案1】:

    您可能“问错了问题”(正如 Raymond Chen 所说);与其尝试避免使用 vanilla 对象,不如尝试更改关联数组成员的命名方式。

    我尝试解决这个问题的方式:不存在数组成员 ns["reflect"],而是更改 jsdiff 构建数组的方式,以便成员为 ns["_reflect"] 或其他一些变体关于那个。

    【讨论】:

    • 我问完这个问题没多久就拍了拍自己的额头。这当然成功了。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在 javascript 中给定的对象只是关联数组,实际上没有其他内置的哈希解决方案。您可以通过在一些数组周围包装一个类来创建自己的伪哈希表,尽管所涉及的手动工作可能会对性能造成重大影响。

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

      【讨论】:

        猜你喜欢
        • 2013-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        • 2018-11-05
        • 2012-11-01
        相关资源
        最近更新 更多