Dstore 过滤器:有没有办法比较属性?

Posted

技术标签:

【中文标题】Dstore 过滤器:有没有办法比较属性?【英文标题】:Dstore Filter: is there a way to compare properties? 【发布时间】:2017-03-22 15:07:30 【问题描述】:

假设我的商店有不同的订单。订单有送货地址和发票地址。地址本身有城市、街道等:

let data = [
         id: 1, name: 'Anna', delivery: city: "Amsterdam", invoice: city: "Amsterdam" ,
         id: 2, name: 'Anton', delivery: city: "Amsterdam", invoice: city: "Berlin"
];

我想过滤所有送货地址和发票地址所在城市相同的订单。

我在 jsFiddle 中尝试过:https://jsfiddle.net/gbwv2bde/3/,但我对结果不太满意。有谁知道使用过滤器完成该任务的方法?

【问题讨论】:

【参考方案1】:

试试这个,它会返回物品 Anna 和 Julie

        var data = [
             id: 1, name: 'Anna', delivery:  city: "Amsterdam" , invoice:  city: "Amsterdam"  ,
             id: 2, name: 'Anton', delivery:  city: "Amsterdam" , invoice:  city: "Berlin"  ,
             id: 3, name: 'John', delivery:  city: "Berlin" , invoice:  city: "Paris"  ,
             id: 4, name: 'Julie', delivery:  city: "Paris" , invoice:  city: "Paris"  
        ];

        var myStore = new Memory( data: data, idProperty: 'id' );
        var myResultsSet = myStore.filter(function (object) 
            return object.delivery.city === object.invoice.city;
        );

        myResultsSet.forEach(function (item) 
            console.log("item ", item.name);
        );

基本上你可以创建一个你自己的函数来传递给filter(),你可以用它来编写你自己的比较逻辑。

查看这里了解更多详情 https://github.com/SitePen/dstore/blob/master/docs/Collection.md

过滤器(查询)

这会过滤集合,返回一个新的子集集合。这 查询可以是一个对象,也可以是一个过滤器对象,具有属性 定义匹配对象的约束。一些商店,如服务器 或 RQL 存储,可以接受基于字符串的查询。内存中的存储 功能(如 dstore/Memory)可以接受过滤功能 同样,但使用过滤器生成器将确保最大 跨商店兼容性。

EDIT:具有更多要比较的属性的示例。您的函数只需要返回一个真或假(如果对象符合您的比较条件,则为真)

        var data = [
             id: 1, name: 'Anna', delivery:  city: "Amsterdam", price: 5 , invoice:  city: "Amsterdam", price: 20  ,
             id: 2, name: 'Anton', delivery:  city: "Amsterdam", price: 8 , invoice:  city: "Berlin", price: 7  ,
             id: 3, name: 'John', delivery:  city: "Berlin", price: 10 , invoice:  city: "Paris", price: 20  ,
             id: 4, name: 'Julie', delivery:  city: "Paris", price: 2 , invoice:  city: "Paris", price: 3   
        ];

        //example for custom filtering with nested properties
        var myStore = new Memory( data: data, idProperty: 'id' );
        var myResultsSet = myStore.filter(function (object) 
            if(object.delivery.city === object.invoice.city)
                if (object.delivery.price < 5 && object.invoice.price < 5)
                    return true;
            else
                return false;
        );

        myResultsSet.forEach(function (item) 
            console.log("item ", item.name);
        ); 

【讨论】:

您好 erotavlas,感谢您的快速回答!这非常适合所描述的问题。不幸的是,我把我的问题简化得太多了......城市是否相等的查询嵌入在更大的过滤器中,例如“城市匹配且价格为 LT x 欧元或城市不匹配且价格为GT y euro" - 我知道这是一个奇怪的例子,但我不想发布真正的问题......你的代码可以集成到这样的过滤器中吗? @ikorni 你是说你想创建一个基于多个属性(不仅仅是城市)的更复杂的过滤器吗?无论如何,我用另一个示例更新了我的答案,该示例表明您可以在函数中添加您想要的任何逻辑。 我想我需要创建另一个问题来说明我的意思,我会尽快找到时间

以上是关于Dstore 过滤器:有没有办法比较属性?的主要内容,如果未能解决你的问题,请参考以下文章

使用 dstore Rest 在查询参数中禁用过滤器

如何使用 contains 方法过滤 dstore?

Dojo dgrid dstore 集合 - “或”过滤器不起作用

HBase 过滤器比较两列

有没有办法在 MongoDB 中创建一个具有多个值的过滤器?

有没有办法过滤/避免 keycloak SAML 断言中的重复属性名称?