javascript - 在对象数组中查找具有更大键的元素

标签 javascript arrays

我正在编写一个小型响应式(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/

相关文章:

javascript - 当控制台显示 "Cannot read property ' length' of undefined 时,这是什么意思?

java - 在 Java 中使用流初始化二维数组

arrays - 读取一个 excel 列并将其唯一值放入一个数组中

javascript - 如何检查 Firebase 中是否存在具有多个字段的节点(子节点)?

javascript - 使用 Stripe.js 和 Skeuocard

javascript - 关于jsLint错误: "Don' t make functions within a loop"的问题

javascript - 编写 v1 嵌套 Web 组件

javascript - 追加一个包含 document.write 的 JS 文件

c++ - 查找数组 C++ 中最小值/最大值的索引

android - 如何解析四方类别json