我使用嵌套的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
和*
。