我正在编写一个小型响应式(Reactive)框架,我需要找出哪个订阅者需要更新。我正在实现深度绑定(bind),但在如何有效地找到订阅者方面遇到了困难。
存储的变量可以是一个对象,例如
{
"user": {
"preferences": {
"food": "vegetarian"
}
}
}
您可以像这样获取此变量的任何级别的内容
getVar("user_preferences_food");
getVar("user_preferences");
但是,您也可以这样更新
setVar("user_preferences_food", "meat");
setVar("user_preferences", {"food": "meat"});
但是如果是第一个 setVar (user_preferences_food
),我如何使用 getVar("user_preferences");
甚至 getVar("user ");
最有效。
我已经通过在 _
上拆分 var 来使其工作,然后逐一连接下一个级别并合并所有结果数组。但这非常耗费资源。特别是如果有很多订阅者。必须有一种更好的方法来找到它们,并且资源消耗较少。
编辑:我省略了部分解释。
还有订阅方法
subscribe("user", cb);
subscribe("user_preferences", cb);
subscribe("user_preferences_food", cb);
这些订阅存储在框架中的数组中。
例如,一旦“user_preferences_food”更新,上面的所有订阅都应该被触发。但显然不是 subscribe('othervar');
订阅方法的简化:
var subscriptions = [];
function subscribe(var, callback){
subscriptions.push({var: var, cb: callback});
}
简化getVar
vars = {};
getVar(var){
// find var in vars with this logic: https://stackoverflow.com/a/18937118/249710
// current exact match on subscribers, but need the "parents, grandparents etc here
var toUpdate = _.where(subscriptions, {
"var" : var
});
_.each(toUpdate, function(sub){ sub.cb();});
}
存储或获取数据作为我已经介绍过的 key 的一部分。只是以最有效的方式找到订阅者
ps:这是在一个我还不能依赖 ES6 的环境中(并非所有用户都启用它),没有 DOM,但我确实包含下划线。 (钛金应用开发平台)
最佳答案
我会尝试为回调创建一个列表,这样您就可以循环遍历一个列表,这样您就不必进行搜索,因为您知道该列表包含所有回调。
因此,如果您调用 setVar('user_prefs'),您将使用根变量设置一个单独的列表。在这种情况下是用户。
如果使用 setVar 更改了任何对象(无论是否深入),您都会转到根变量,获取列表并使用回调循环遍历此列表。
这样做的好处是你可以使用根变量设置一个列表, var cbList[FIRSTVAR] 这包含所有回调。没有搜索只是循环。
这是 mongoDb 的原理,数据已经准备好了,你不需要搜索,因为你知道列表已经在那里。
关于javascript - 在对象数组中查找具有更大键的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51282402/