tengo esta expresion:
var s2 = of(6, 16, 26).pipe( map(v1=>of(5, 15, 25).pipe( map(v2=>[v1,v2]) )), combineLatestAll()); s2.subscribe(console.log) ... y s2 es de tipo Observable<number[][]> como lo quiero.
¿Puedo convertir la siguiente expresión de manera similar a Observable<number[][][]> (en lugar de que sea un Observable<Observable<number[]>[]> ):
var r2 = of(5, 15, 25).pipe( map(v1=>of(6, 16, 26).pipe( map(v2=>of(7, 17, 27).pipe( map(v3 => [v1,v2,v3]) )))), combineLatestAll()); //Print the output: r2.subscribe(e1 => { e1.forEach(e2 => { e2.subscribe(e3 => { console.log(e3); }); }) });No puedo entenderlo. Cualquier ayuda apreciada.
Solución sugerida por Ruth:
let s3: Observable<number> = of(5, 15, 25); let s4: Observable<number> = of(6, 16, 26); let s5: Observable<number> = of(7, 17, 27); const r1 = s3.pipe( map((v3: number) => s4.pipe( mergeMap((v4: number) => s5.pipe( reduce((acc: number[][], v5: number, i5: number) => { acc[i5] = [v3, v4, v5]; return acc; }, []) ) ) ) ), combineLatestAll()//reduce((acc: number[][], curr: number[][]) => [...acc, curr], []) ) r1.subscribe(console.log);Parece que podría usar solo el operador toArray() pero es bastante difícil entender las llamadas anidadas, así que no estoy seguro de que esto sea lo que quería :):
var r2 = of(5, 15, 25).pipe( map(v1=>of(6, 16, 26).pipe( map(v2=>of(7, 17, 27).pipe( map(v3 => [v1,v2,v3]), toArray(), )))), combineLatestAll());Demostración en vivo: https://stackblitz.com/edit/rxjs-veofem?devtoolsheight=60
... o si desea evitar el Observable anidado, necesitará mergeMap :
var r2 = of(5, 15, 25).pipe( map(v1=>of(6, 16, 26).pipe( mergeMap(v2=>of(7, 17, 27).pipe( map(v3 => [v1,v2,v3]), toArray(), )))), combineLatestAll()); r2.subscribe(e1 => { e1.forEach(e2 => { console.log(e2); }) });Demostración en vivo: https://stackblitz.com/edit/rxjs-riquzh?devtoolsheight=60
algo como a continuación, su combineLatestAll() solo funciona para el mapa de primer nivel, por eso devuelve el resultado incorrecto. Prefiero controlar manualmente la ejecución de observable con mergeMap , switchMap , etc.
of(5, 15, 25) .pipe( mergeMap((v1) => of(6, 16, 26).pipe( mergeMap((v2) => of(7, 17, 27).pipe(map((v3) => [v1, v2, v3]) )) ) ) ) .subscribe(console.log);Según su comentario, en mi opinión, este es un ejercicio relativamente difícil de aprender RxJS. Sin embargo, además de la solución proporcionada por @martin, puede intentar usar el operador reduce con concatMap para configurar manualmente la matriz.
Tenga en cuenta que reduce((acc, curr) => [...acc, curr], []) es sinónimo del operador toArray() .
const { of } = rxjs; const { concatMap, reduce } = rxjs.operators; const jsonEditor = document.getElementById('json-editor'); const textContainer = document.getElementById('text-container'); const options = {}; const editor = new JSONEditor(jsonEditor, options); let s3 = of(5, 15, 25); let s4 = of(6, 16, 26); let s5 = of(7, 17, 27); s3.pipe( concatMap((v3) => s4.pipe( concatMap((v4) => s5.pipe( reduce((acc, v5, i5) => { acc[i5] = [v3, v4, v5]; return acc; }, []) ) ) ) ), reduce((acc, curr) => [...acc, curr], []) ).subscribe({ next: (response) => editor.set(response), error: (error) => textContainer.innerHTML = error }); <link href="https://unpkg.com/jsoneditor@9.4.1/dist/jsoneditor.css" rel="stylesheet" type="text/css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/7.5.5/rxjs.umd.min.js"></script> <script src="https://unpkg.com/jsoneditor@9.4.1/dist/jsoneditor-minimalist.min.js"></script> <div id="json-editor" style="width: 100%; height: 100%;"></div> <span id="text-container"></span> import { of, Observable } from 'rxjs'; import { concatMap, reduce } from 'rxjs'; let s3: Observable<number> = of(5, 15, 25); let s4: Observable<number> = of(6, 16, 26); let s5: Observable<number> = of(7, 17, 27); s3.pipe( concatMap((v3: number) => s4.pipe( concatMap((v4: number) => s5.pipe( reduce((acc: number[][], v5: number, i5: number) => { acc[i5] = [v3, v4, v5]; return acc; }, []) ) ) ) ), reduce((acc: number[][], curr: number[][]) => [...acc, curr], []) ).subscribe(console.log);Ejemplo de trabajo: Stackblitz