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

如何在.subscribe接收数据后,使用多键对象过滤原始数组?

用可变键对象过滤RxJS订阅数据的实现方案

嘿,这个需求其实很好解决,咱们可以通过数组原生方法结合对象键遍历的逻辑,轻松实现用包含多个可变键的条件对象过滤原始数据,而且不管以后条件里加多少个新的键,代码都能适配。

核心思路

咱们需要完成两个核心动作:

  • 检查单个数据项是否匹配某一个条件对象的所有键值对(不管条件里有多少个键)
  • 从原始数据中筛选出至少匹配一个条件的项

具体实现代码

首先,先写一个通用的匹配函数,用来判断单个数据项是否符合某个条件对象:

const matchesCondition = (item: any, condition: any) => {
  // 遍历条件对象的所有键,确保每个键对应的数值都和数据项完全一致
  return Object.keys(condition).every(key => item[key] === condition[key]);
};

然后在RxJS的subscribe回调里,用这个函数配合数组的filter和some方法来过滤数据:

// 假设这是你的Observable订阅逻辑
yourDataObservable.subscribe(oriDa => {
  // 你的条件数组,支持同时设置多个过滤条件
  const cons = [{ yr: 2015, mth: "Feb" }];
  
  // 执行过滤逻辑
  const res = oriDa.filter(item => {
    // 检查当前数据项是否匹配条件数组中的任意一个条件
    return cons.some(condition => matchesCondition(item, condition));
  });

  console.log(res); // 输出就是你想要的结果:[{yr:2015, mth:"Feb", A:24, B:30}]
});

优化类型(可选)

如果你想避免any带来的类型不安全问题,可以定义对应的接口来约束数据结构:

// 定义原始数据的类型
interface DataItem {
  yr: number;
  mth: string;
  A: number;
  B: number;
}

// 定义条件对象的类型,支持任意字符串键,值可以是数字或字符串
interface FilterCondition {
  [key: string]: number | string;
}

// 使用时指定类型
const oriDa: DataItem[] = [
  {yr: 2015, mth: "Jan", A: 23, B: 29},
  {yr: 2015, mth: "Feb", A: 24, B: 30},
  {yr: 2015, mth: "Mar", A: 25, B: 31},
  {yr: 2016, mth: "Jan", A: 26, B: 32},
  {yr: 2016, mth: "Feb", A: 27, B: 33},
  {yr: 2016, mth: "Mar", A: 28, B: 34},
];

const cons: FilterCondition[] = [{ yr: 2015, mth: "Feb" }];

这样代码的可读性和安全性都会更高,以后维护起来也更方便~

内容的提问来源于stack exchange,提问作者W Kenny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:58:16