Dstore Filter: есть ли способ сравнить свойства?

Предположим, у меня есть магазин с разными заказами. Заказы имеют адрес доставки и адрес счета. У самого адреса есть город, улица и т.д.:

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 ответ

Решение

Попробуйте это, он вернет предметы Анна и Джули

        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) могут также принимать функцию фильтрации, но использование построителя фильтров обеспечит наилучшую совместимость между хранилищами.

РЕДАКТИРОВАТЬ: Пример с большим количеством свойств для сравнения. Ваша функция просто должна возвращать true или false (true, если объект соответствует вашим условиям сравнения)

        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);
        }); 
Другие вопросы по тегам