昨天和前天,在工作中,将一个双重循环的寻找逻辑,改为饿了用对象模拟的Map逻辑,使得效率一下子就提高了很多。今天就想和你聊聊这个类似Map的逻辑。
一开始并没有搜到JS中Map的用法,所以才采用了双重循环的逻辑。11月份在刚开始做这个功能的时候,是有在网上查过JS中的Map用法的,网上的大多解决方案是用循环去模拟Map。理由是JS中并没有Map这个数据结构。后来去W3C上查,也确实没有,外加之当时对JS对象的理解并不深,所以最终用双重循环先实现了功能。
不过在搜寻的过程中产生了一个疑惑。如果Map这种数据结构在Java中能得到广泛地运用,那就说明它是有相当使用场景的,既然如此,那么JS中为什么就没有Map这种数据结构呢?这不合理的,一个在另外一门语言中被证明有效的数据结构,在另一门集大成的语言中不应该没有一席之地的。
项目在继续,悬念就一直搁置着。直到最近,在查询对象的另一个功能时,偶然间碰见了对象属性的另一种调用方式,我突然觉得,对这个疑问似乎有了答案。
正常情况下,传承于Java流的调用风格,切换到JS中的时候,第一想法就是用点号“.”得到相应的属性,并且这是有效的。但如果JS中对象的属性名是数字的话,那么用“.”就不适用了。比如Map是这样的:column={1:"硅谷来信", 2:"前哨", 3:"大局观", …}。那这个时候该怎么调用呢。用“[]”,如果我想得到硅谷来信,我就这么写:column[1]。
这种写法是我在查找如何遍历JS对象的属性值的时候偶然间发现的。这种做法将Map的数据结构和对象从相互独立的关系变为了从属关系,Map是对象的子集,是它的一种表现方式。简单点儿说就是,Map即对象,对象即Map。
如此一来,也解除了另外两个现象。一,Java后台返回的Map,自动被解析为了JS中的对象。二,JS中的对象可以临时增添值,而对象的内存地址值不变。根据现象二,可以形成比如一个推论,在第三方控件的内部对象中可以临时增加属性值,便于对第三方控件做拓展,实现自己的功能。
比如在使用EChart的日历饼图的时候,可以在构造对象的时候,加入事件id,在点击具体的某一块的饼的时候,可以得到这块饼的对应的事件了。
今天和你聊了聊我对JS中对象的,一个新角度的理解,希望能对你有所帮助。
清 单