You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用RxJS将Observable返回数组中的嵌套对象移至根数组?

解决方案:用RxJS扁平化混合了对象与嵌套数组的数据流

你需要处理的是Observable发出的混合结构数组——里面既有单个对象,也包含子数组(子数组内是对象),目标是把所有子数组里的对象拉平到根层级,得到一个纯对象的数组。下面提供几种简洁的RxJS实现方案:

方案1:数组层面直接扁平化(最简洁高效)

利用数组的flatMap方法结合RxJS的concatMap,在同步层面完成扁平化,完全适配你的场景:

import { of } from 'rxjs';
import { concatMap } from 'rxjs/operators';

// 模拟你的源Observable
const source$ = of([
  {id: "12321", itemName: "Item 1", category: "All"},
  [
    {id: "423423", itemName: "Sub Item 1", category: "subcat"},
    {id: "413212", itemName: "Sub Item 2", category: "subcat"}
  ],
  {id: "65655", itemName: "Item 2", category: "All"},
  {id: "87877", itemName: "Item 3", category: "All"},
  [
    {id: "354345", itemName: "Sub Item 1", category: "subcat"},
    {id: "123434", itemName: "Sub Item 2", category: "subcat"},
    {id: "765767", itemName: "..."}
  ]
]);

// 扁平化处理
const flattened$ = source$.pipe(
  concatMap(arr => 
    arr.flatMap(item => Array.isArray(item) ? item : [item])
  )
);

// 订阅查看结果
flattened$.subscribe(result => {
  console.log("扁平化后的数组:", result);
});

逻辑说明:

  1. concatMap接收Observable发出的原始数组,进入数组处理逻辑;
  2. 数组的flatMap遍历每个元素:如果是子数组,直接返回该数组(自动展开);如果是单个对象,把它包装成单元素数组,最终flatMap会把所有元素合并成一个纯对象数组。

方案2:用RxJS操作符拆分-合并(适合扩展异步场景)

如果后续需要在扁平化过程中加入异步操作(比如每个对象需要请求额外数据),可以用RxJS的mergeMap+toArray组合,灵活性更高:

import { of } from 'rxjs';
import { mergeMap, toArray } from 'rxjs/operators';

const flattened$ = source$.pipe(
  // 第一步:把原始数组拆分成单个元素(对象/子数组)依次发出
  mergeMap(arr => arr),
  // 第二步:处理每个元素,子数组拆成单个对象发出,单个对象直接发出
  mergeMap(item => Array.isArray(item) ? of(...item) : of(item)),
  // 第三步:把所有发出的对象重新收集成一个数组
  toArray()
);

flattened$.subscribe(result => console.log(result));

逻辑说明:

先将原始数组拆分成流中的单个元素,再对每个元素做展开处理,最后把流中的所有对象汇总成数组,这种方式方便插入异步操作(比如在mergeMap里调用API)。


扩展:处理深度嵌套数组

如果你的数据存在多层嵌套(比如数组里的数组里还有数组),可以用递归函数实现深度扁平化:

// 递归扁平化函数
const flattenDeep = (item: any): any[] => {
  if (Array.isArray(item)) {
    return item.flatMap(flattenDeep);
  }
  return [item];
};

const flattened$ = source$.pipe(
  concatMap(arr => arr.flatMap(flattenDeep))
);

这个函数会自动处理任意层级的嵌套数组,最终输出纯对象的根数组。

内容的提问来源于stack exchange,提问作者Guruprasad J Rao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:40:14