Запрос подмножества из angularfire2

Мне нужно получить подмножество из списка firebase. Допустим, у меня есть два набора:

set1 = {
    dog:true,
    cat:true,
    snake:true,
    bull:true
}

а также

set2 = {
    dog:true,
    cat:true
}

Мне нужно получить «в наборе1, но не в наборе2», в этом случае он вернется:

setresult = {
    snake:true,
    bull:true
}

Я пытался добиться этого с помощью карты:

this.setresult = this.af.database.list('/set2/').map((animals) => {
        return animals.map((animal) => {
            if (auth.uid == _user.$key || af.database.object('set2/' + animal.$key) == null) {}
            else {

                return af.database.object('set1/' + animal.$key);
            }
        })
    })

Но в итоге я получаю список с нулями, и мне нужен только результирующий набор.

Заранее спасибо.


person Luis Abe    schedule 21.09.2016    source источник


Ответы (1)


Вы можете использовать оператор combineLatest для составить наблюдаемую, которая генерирует объект, содержащий ключи/значения из set1, которых нет в set2:

import * as Rx from "rxjs/Rx";

let set = Rx.Observable.combineLatest(

    // Combine the latest values from set1 and set2
    // using AngularFire2 object observables.

    this.af.database.object('/set1/'),
    this.af.database.object('/set2/'),

    // Use the operator's project function to emit an
    // object containing the required values.

    (set1, set2) => {
        let result = {};
        Object.keys(set1).forEach((key) => {
            if (!set2[key]) {
                result[key] = set1[key];
            }
        });
        return result;
    }
);

set.subscribe((set) => { console.log(set); });
person cartant    schedule 22.09.2016
comment
пример работает нормально, но по какой-то причине я не могу отобразить результат в cartant. Представление (с использованием ngFor и асинхронного канала) с использованием: <li *ngFor="let item of animallist | async" >{{item.name}}</li> я получаю Не удается найти другой вспомогательный объект '[object Object]' типа 'объект'. NgFor поддерживает привязку только к Iterables, таким как Arrays. - person Luis Abe; 23.09.2016
comment
Если пример в ответе работает, но у вас возникли проблемы с отображением результата в представлении, было бы лучше, если бы вы создали еще один вопрос, который включает компонент, шаблон и составную наблюдаемую. Другим будет легче помочь вам. Тем более, что вы уже приняли этот ответ. - person cartant; 23.09.2016
comment
Без проблем. Просто включите соответствующие части. Вся история не нужна. Если по какой-то причине вы считаете, что история важна, просто включите ссылку на этот вопрос вместе с соответствующими фрагментами кода для нового вопроса. Сделайте это простым и ясным, и вы повысите свои шансы на получение своевременного и точного ответа. - person cartant; 23.09.2016
comment
если у вас есть время, посмотрите ссылку, повторите попытку @cartant - person Luis Abe; 23.09.2016