【问题标题】:Performing a query on the lowest level of a tree-structured Dojo store在树形结构 Dojo 存储的最低级别上执行查询
【发布时间】:2013-10-31 21:03:46
【问题描述】:

假设我们有一个像这样的嵌套数据结构:

[
   {  
     "name": "fruits",
     "items": [
        { "name": "apple" ...}
        { "name": "lemon" ...}
        { "name": "peach" ...}
     ]
   }
   {
     "name": "veggies", 
     "items": [
        { "name": "carrot" ...}
        { "name": "cabbage" ...}
     ]
   } 
   { 
     "name": "meat",
     "items": [
       { "name": "steak" ...}
       { "name": "pork" ...}
     ]
   }
]

以上数据放在一个dojo/store/Memory中。我想对包含字母“c”的项目执行查询,但仅限于较低级别(不想查询类别)。

对于一个通用的dojo/store/Memory,它的查询功能只在顶层应用一个过滤器,所以代码

store.query(function(item) {
    return item.name.indexOf("c") != -1;
});

将仅对类别名称(水果、蔬菜等)而不是实际项目执行查询。

是否有一种直接的方法可以在子节点上执行此查询,如果匹配,则返回所有子节点以及父节点?例如,“c”查询将返回“fruits”节点及其“peach”子节点,“veggies”将保持原样,“meat”将完全排除在查询结果之外。

【问题讨论】:

    标签: store dojo


    【解决方案1】:

    您当然可以在商店的查询方法中定义自己的检查方法。我不检查这段代码是否完美运行,但我想你几乎可以得到它的意思。

    store.query(function(item) {
        var found = {
            name: "",
            items: []
        };
        var children = item.items;
        d_array.forEach(children, function(child) {
            if (child.name.indexOf("c") != -1) {
                found.name = item.name;
                found.items.push(child); 
            }
        });
        return found;
    });
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复,printemps。如果任何一个子级与查询值(“c”)匹配,您提供的代码将简单地导致查询返回顶级数据及其所有子级。我可以重新编写代码以将所有匹配项放在一个临时数组中并复制商店的结构,但我希望商店查询返回必要的结构,而无需在查询函数之外进行任何工作。这可能吗?
    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 2016-03-18
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多