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

在AngularJS中按应用名称+最新时间戳过滤JSON数据

在AngularJS中实现按应用分组并筛选最新时间戳条目的方案

嘿,这个需求我熟!要搞定从API返回的JSON数据里按应用名称分组,再筛选每个应用最新时间戳的条目,核心思路就是先按appName分组,再在每组里保留时间最新的那条。下面给你两种实用的实现方式,你可以根据自己的场景选择:

先看一下你的数据示例

原始JSON数据

[
  {
    "appName": "AppA",
    "timeStamp": "2024-05-20T14:30:00",
    "details": "Version 1.0"
  },
  {
    "appName": "AppA",
    "timeStamp": "2024-05-21T09:15:00",
    "details": "Version 1.1"
  },
  {
    "appName": "AppB",
    "timeStamp": "2024-05-19T16:45:00",
    "details": "Initial Release"
  },
  {
    "appName": "AppB",
    "timeStamp": "2024-05-22T11:00:00",
    "details": "Version 2.0"
  }
]

期望的过滤结果

[
  {
    "appName": "AppA",
    "timeStamp": "2024-05-21T09:15:00",
    "details": "Version 1.1"
  },
  {
    "appName": "AppB",
    "timeStamp": "2024-05-22T11:00:00",
    "details": "Version 2.0"
  }
]

方案一:控制器预处理数据(推荐,性能更优)

如果你的数据不会频繁变动,优先选这种方式——因为过滤器会在Angular的每次消化周期都执行,数据量大时会影响性能,而预处理只在数据加载时执行一次。

控制器代码

angular.module('myApp', [])
.controller('MyController', function($scope) {
  // 模拟从API获取的原始数据
  $scope.rawData = [
    { "appName": "AppA", "timeStamp": "2024-05-20T14:30:00", "details": "Version 1.0" },
    { "appName": "AppA", "timeStamp": "2024-05-21T09:15:00", "details": "Version 1.1" },
    { "appName": "AppB", "timeStamp": "2024-05-19T16:45:00", "details": "Initial Release" },
    { "appName": "AppB", "timeStamp": "2024-05-22T11:00:00", "details": "Version 2.0" }
  ];

  // 封装处理逻辑:分组并筛选最新条目
  const getLatestAppEntries = (data) => {
    const appGroups = {};
    
    data.forEach(item => {
      // 把时间戳转成Date对象,方便比较大小
      const currentItemDate = new Date(item.timeStamp);
      // 如果当前应用还没在分组里,或者当前条目的时间比已存的更新
      if (!appGroups[item.appName] || new Date(appGroups[item.appName].timeStamp) < currentItemDate) {
        appGroups[item.appName] = item;
      }
    });

    // 把分组后的对象转成数组返回
    return Object.values(appGroups);
  };

  // 得到处理后的最终数据
  $scope.filteredData = getLatestAppEntries($scope.rawData);
});

视图代码

<div ng-app="myApp" ng-controller="MyController">
  <div ng-repeat="item in filteredData" class="app-item">
    <h3>{{item.appName}}</h3>
    <p>最新更新时间:{{item.timeStamp}}</p>
    <p>详情:{{item.details}}</p>
  </div>
</div>

方案二:自定义过滤器(适合动态过滤场景)

如果你的数据需要实时动态更新(比如用户操作后数据变化),可以用自定义过滤器,直接在视图里过滤数据。

过滤器+控制器代码

angular.module('myApp', [])
// 自定义过滤器:latestByApp
.filter('latestByApp', function() {
  return function(data) {
    // 先判断输入是否为数组,避免报错
    if (!Array.isArray(data)) return [];

    const appGroups = {};
    data.forEach(item => {
      const currentItemDate = new Date(item.timeStamp);
      if (!appGroups[item.appName] || new Date(appGroups[item.appName].timeStamp) < currentItemDate) {
        appGroups[item.appName] = item;
      }
    });

    return Object.values(appGroups);
  };
})
.controller('MyController', function($scope) {
  $scope.rawData = [
    { "appName": "AppA", "timeStamp": "2024-05-20T14:30:00", "details": "Version 1.0" },
    { "appName": "AppA", "timeStamp": "2024-05-21T09:15:00", "details": "Version 1.1" },
    { "appName": "AppB", "timeStamp": "2024-05-19T16:45:00", "details": "Initial Release" },
    { "appName": "AppB", "timeStamp": "2024-05-22T11:00:00", "details": "Version 2.0" }
  ];
});

视图代码

<div ng-app="myApp" ng-controller="MyController">
  <div ng-repeat="item in rawData | latestByApp" class="app-item">
    <h3>{{item.appName}}</h3>
    <p>最新更新时间:{{item.timeStamp}}</p>
    <p>详情:{{item.details}}</p>
  </div>
</div>

注意事项

  • 确保你的timeStamp格式能被new Date()正确解析,如果是特殊格式(比如时间戳数字),需要调整时间转换的逻辑。
  • 性能方面:数据量大时优先选方案一,预处理只会执行一次;方案二的过滤器会在每次Angular消化周期触发,频繁执行可能导致性能问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:38:05