2
votes

Quelle est la meilleure façon de fusionner les résultats d'Observables consécutifs?

Disons que j'ai un observable qui donne un objet de 3 tableaux comme celui-ci:

    results1 = {
        type1: [1, 2],
        type2: ['ab', 'cd'],
        type3: ['foo', 'bar'],
    };

    results2 = {
        type1: [3, 4, 5],
        type2: ['ef', 'gh', 'ij'],
        type3: ['ban', 'jo', 'vi'],
    };

    final_results = {
        type1: [1, 2, 3, 4, 5],
        type2: ['ab', 'cd', 'ef', 'gh', 'ij'],
        type3: ['foo', 'bar', 'ban', 'jo', 'vi'],
    };

Existe-t-il un opérateur rxjs qui me permet de combiner plusieurs observables et leurs résultats afin d'avoir un résultat final comme celui-ci:

    results = {
        type1: [...],
        type2: [...],
        type3: [...],
    };

??????

Pour mémoire, j'utilise Angular 2+ et dactylographié, et je veux continuez à utiliser les flux observables et les opérateurs rxjs, mais d'après leur documentation, je ne suis pas sûr qu'ils soient ceux qui pourraient faire quelque chose comme 'deep merging ??'

Merci de votre aide


1 commentaires

Il existe plusieurs opérateurs qui peuvent fusionner les données de deux observables, mais la concaténation des valeurs est quelque chose de logique. Vous pouvez utiliser l'un des opérateurs pour fusionner les données et les concaténer manuellement.


3 Réponses :


1
votes

Ce n'est pas lié à l'observable, c'est du vieux Javascript.

Le seul opérateur que vous devez connaître est combineLatest :

combineLatest(results1$, results2$).pipe(
  map((results1, results2) => {
    const ret = {};
    Object.keys(results1).foreEach(key => ret[key] = results1[key].concat(results2[key]));
    return ret;
  })
).subscribe(res => console.log(res)); // should display your expected result

Ne vous y trompez pas: les opérateurs RxJS manipulent le flux (l'Observable lui-même ), pas les données qu'il contient.

Si vous souhaitez gérer les données internes, cela devient Javascript.


0 commentaires

1
votes

vous pouvez utiliser l'opérateur réduire pour agréger un seul résultat parmi plusieurs valeurs émises. C'est à vous de fusionner les tableaux simples car cela n'est pas lié à rxjs

Exemple simple: https://stackblitz.com/edit/angular-cffyyh < / p>


0 commentaires

3
votes

Vous recherchez l'opérateur de scan:

https://www.learnrxjs.io/operators/transformation/scan.html

Il est similaire à l'opérateur reduction , mais l'opérateur de réduction sera émettre uniquement à la fin du flux. L'opérateur d'analyse émettra la valeur intermédiaire à chaque fois.


0 commentaires