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

Angular中如何根据嵌套值过滤键值对数据?

解决Angular中嵌套JSON数据的过滤问题

嘿,作为Angular新手碰到这种嵌套的键值对数据确实容易无从下手,别担心,我来带你一步步实现你需要的过滤逻辑!

思路分析

你的需求是从嵌套的旅程数据中,筛选出所有包含place[value]='Vienna'的旅程条目,同时保留原有的日期分组结构,并且去掉没有符合条件条目的日期键(比如示例中的20180301)。核心步骤是:

  • 遍历外层的所有日期键
  • 对每个日期下的旅程数组进行过滤,只保留包含Vienna的旅程
  • 仅将过滤后不为空的日期分组保留到结果中

代码实现

我们可以用TypeScript来编写这个过滤函数,完全适配Angular项目:

// 原始旅程数据
const journey = {
  "20180201": [{
          "journeyId": 1001,
          "Number": "001",
          "DriverName":"Alex",
          "Transporter": {
              "id": "T1",
              "number": "AN01001",
              "Company": "Tranzient"
          },
          "place": [{"id":001,"value":"Washington DC" },
                    {"id":002,"value":"Canberra"}]
      },
      {
         "journeyId": 1002,
          "Number": "001",
          "DriverName":"Tom",
          "Transporter": {
              "id": "T2",
              "number": "AN01002",
              "Company": "Trax"
          },
          "place": [{"id":002,"value":"Canberra" },
                    {"id":004,"value":"Vienna"}]
      },
      {
           "journeyId": 1003,
          "Number": "004",
          "DriverName":"Jack",
          "Transporter": {
              "id": "T3",
              "number": "AN01003",
              "Company": "Trax"
          },
          "place": [{"id":001,"value":"Washington DC" },
                    {"id":004,"value":"Vienna"}]
      }],
  "20180211": [{
           "journeyId": 1004,
          "Number": "005",
          "DriverName":"Jack",
          "Transporter": {
              "id": "T3",
              "number": "AN01013",
              "Company": "Trax"
          },
          "place": [{"id":005,"value":"Bridgetown" },
                    {"id":006,"value":"Ottawa"},
                    {"id":004,"value":"Vienna"}]

      },
      {
         "journeyId": 1005,
          "Number": "005",
          "DriverName":"Jerry",
          "Transporter": {
              "id": "T3",
              "number": "AN01020",
              "Company": "Trax"
          },
          "place": [{"id":005,"value":"Bridgetown" },
                    {"id":006,"value":"Ottawa"}]
      }],
  "20180301": [{
          "journeyId": 1006,
          "Number": "005",
          "DriverName":"demy",
          "Transporter": {
              "id": "T3",
              "number": "AN01003",
              "Company": "Trax"
          },
          "place": [{"id":005,"value":"Bridgetown" },
                    {"id":006,"value":"Ottawa"}]
      }]
};

// 过滤函数
function filterJourneysByTargetPlace(journeyData: any, targetPlace: string) {
  const filteredJourney: any = {};
  
  // 遍历所有日期键
  Object.keys(journeyData).forEach(dateKey => {
    // 过滤当前日期下的旅程,只保留包含目标地点的条目
    const filteredTrips = journeyData[dateKey].filter((trip: any) => {
      // 检查trip的place数组中是否有value等于目标地点的元素
      return trip.place.some((place: any) => place.value === targetPlace);
    });
    
    // 如果过滤后有结果,才添加到最终对象中
    if (filteredTrips.length > 0) {
      filteredJourney[dateKey] = filteredTrips;
    }
  });
  
  return filteredJourney;
}

// 调用函数,过滤出包含Vienna的旅程
const filteredResult = filterJourneysByTargetPlace(journey, 'Vienna');
console.log(filteredResult);

代码解释

  • Object.keys(journeyData):获取外层所有的日期字符串键,比如"20180201"、"20180211"
  • journeyData[dateKey].filter(...):对每个日期下的旅程数组进行过滤,只保留符合条件的旅程
  • trip.place.some(...):检查当前旅程的place数组中,是否存在至少一个元素的value等于'Vienna',some方法只要找到一个符合条件的元素就会返回true
  • 最后只把过滤后不为空的日期分组添加到结果对象,避免保留空数组的日期键

运行这段代码后,你得到的结果就和你期望的完全一致啦!

内容的提问来源于stack exchange,提问作者Udit Gogoi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:19:43