用于排序和匹配通配符事件的数据结构和算法

时间:2014-06-17 08:42:35

标签: javascript algorithm

我使用嵌套的JavaScript对象作为数据存储区。我想创建通配符侦听器,它会触发对此数据存储区的更改。

让我们说store包含:

{
  a: 1,
  b: {
    x: 5,
    y: 6
  },
  c: 2
}

我想用

来听取变化事件
store.on('b.y', function() {
  console.log('b.y fired!');
})

store.on('b.*', function() {
  console.log('b.* fired!');
})

如果仅允许合并操作,则使用{ a:2, b:{ x:7, y:8 }}更新此商店应该产生:

b.y fired! //b.y 6->8
b.* fired! //b.x 5->7
b.* fired! //b.y 6->8

以下是我目前获得的匹配算法,但我正在寻找更好的东西。

1#执行此操作的一种方法是将事件存储为路径字符串(Node.js事件发射器的工作方式),然后在更新期间,使用concat属性生成路径字符串。这个问题是通配符 - 我需要1.生成路径的所有通配符组合或2.对事件执行正则表达式线性搜索 - 我不喜欢这两种情况。

2#更好的方法是创建事件的集合嵌套对象。存储为:

{
   listeners: []
   children: {
      'b': {
         listeners: []
         children: {
           'y': {
             listeners: [fn],
             children: {}
           },
           '*': {
             listeners: [fn],
             children: {}
           }
         }
      }
   }
}

通过遍历store时遍历事件树找到匹配事件。在事件树的每个级别,*事件也与给定属性的事件一起被采用。例如,当b.y发生更改时,b事件对象会遍历y*

0 个答案:

没有答案