【问题标题】:Filter json based on key and latest timestamp key in angularjs根据angularjs中的键和最新的时间戳键过滤json
【发布时间】:2018-05-28 10:47:59
【问题描述】:

我有一个 JSON 文件,它是从包含不同应用程序名称和时间戳以及其他详细信息的远程 api 中获取的。我需要使用两个过滤器过滤这个 json,即应用程序名称 + 最新时间戳。 json文件如下:

{
    "data": [
        {
          "appDetails": [
            {
              "appDescription": [
                {
                  "appName": "App 1",
                  "timeStamp": "2018-05-28T00:01:01.001Z",
                  "GitTag": "RELEASE-1.0.1.24",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                },
                {
                  "appName": "App 1",
                  "timeStamp": "2018-05-27T00:01:01.001Z",
                  "GitTag": "RELEASE-1.0.1.23",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                },
                {
                  "appName": "App 2",
                  "timeStamp": "2018-05-26T00:01:01.001Z",
                  "GitTag": "RELEASE-1.0.1.22",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                },
                {
                  "appName": "App 2",
                  "timeStamp": "2018-05-28T00:01:01.001Z",
                  "GitTag": "RELEASE-1.0.1.3",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                },
                {
                  "appName": "App 2",
                  "timeStamp": "2018-05-26T00:01:01.001Z",
                  "GitTag": "RELEASE-1.0.1.2",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                },
                {
                  "appName": "App 3",
                  "timeStamp": "2018-05-27T00:01:01.001Z",
                  "GitTag": "RELEASE-1.0.0.9",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                },
                {
                  "appName": "App 3",
                  "timeStamp": "2018-05-25T00:01:01.001Z",
                  "GitTag": "RELEASE-1.0.0.8",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                },
                {
                  "appName": "App 4",
                  "timeStamp": "2018-05-28T00:01:01.001Z",
                  "GitTag": "RELEASE-1.1.1.8",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                },
                {
                  "appName": "App 4",
                  "timeStamp": "2018-05-25T00:01:01.001Z",
                  "GitTag": "RELEASE-1.1.1.6",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                }
              ]
            }
          ]
        }
      ]
    }

例如,我需要从上面的 json 中筛选出一个包含应用程序名称和最新时间​​戳的过滤数组。

filteredArray = [{
                  "appName": "App 1",
                  "timeStamp": "2018-05-28T00:01:01.001Z",
                  "GitTag": "RELEASE-1.0.1.24",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                  },
                  {
                  "appName": "App 2",
                  "timeStamp": "2018-05-28T00:01:01.001Z",
                  "GitTag": "RELEASE-1.0.1.3",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                },
                {
                  "appName": "App 3",
                  "timeStamp": "2018-05-27T00:01:01.001Z",
                  "GitTag": "RELEASE-1.0.0.9",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                },
                {
                  "appName": "App 4",
                  "timeStamp": "2018-05-28T00:01:01.001Z",
                  "GitTag": "RELEASE-1.1.1.8",
                  "blocker": 3,
                  "critical": 4,
                  "major": 30,
                  "minor": 3,
                  "UnitTestsTotal": 59,
                  "FailedTests": 0,
                  "CodeCoverage": 90
                }
]

我现在的 angularjs 代码如下所示:

var myApp = angular.module('myApp', []);

function MyCtrl($scope) {

  $scope.tableData = [{
              "appName": "App 1",
              "timeStamp": "2018-05-28T00:01:01.001Z",
              "GitTag": "RELEASE-1.0.1.24",
              "blocker": 3,
              "critical": 4,
              "major": 30,
              "minor": 3,
              "UnitTestsTotal": 59,
              "FailedTests": 0,
              "CodeCoverage": 90
            },
            {
              "appName": "App 1",
              "timeStamp": "2018-05-27T00:01:01.001Z",
              "GitTag": "RELEASE-1.0.1.23",
              "blocker": 3,
              "critical": 4,
              "major": 30,
              "minor": 3,
              "UnitTestsTotal": 59,
              "FailedTests": 0,
              "CodeCoverage": 90
            },
            {
              "appName": "App 2",
              "timeStamp": "2018-05-26T00:01:01.001Z",
              "GitTag": "RELEASE-1.0.1.22",
              "blocker": 3,
              "critical": 4,
              "major": 30,
              "minor": 3,
              "UnitTestsTotal": 59,
              "FailedTests": 0,
              "CodeCoverage": 90
            },
            {
              "appName": "App 2",
              "timeStamp": "2018-05-28T00:01:01.001Z",
              "GitTag": "RELEASE-1.0.1.3",
              "blocker": 3,
              "critical": 4,
              "major": 30,
              "minor": 3,
              "UnitTestsTotal": 59,
              "FailedTests": 0,
              "CodeCoverage": 90
            },
            {
              "appName": "App 2",
              "timeStamp": "2018-05-26T00:01:01.001Z",
              "GitTag": "RELEASE-1.0.1.2",
              "blocker": 3,
              "critical": 4,
              "major": 30,
              "minor": 3,
              "UnitTestsTotal": 59,
              "FailedTests": 0,
              "CodeCoverage": 90
            },
            {
              "appName": "App 3",
              "timeStamp": "2018-05-27T00:01:01.001Z",
              "GitTag": "RELEASE-1.0.0.9",
              "blocker": 3,
              "critical": 4,
              "major": 30,
              "minor": 3,
              "UnitTestsTotal": 59,
              "FailedTests": 0,
              "CodeCoverage": 90
            },
            {
              "appName": "App 3",
              "timeStamp": "2018-05-25T00:01:01.001Z",
              "GitTag": "RELEASE-1.0.0.8",
              "blocker": 3,
              "critical": 4,
              "major": 30,
              "minor": 3,
              "UnitTestsTotal": 59,
              "FailedTests": 0,
              "CodeCoverage": 90
            },
            {
              "appName": "App 4",
              "timeStamp": "2018-05-28T00:01:01.001Z",
              "GitTag": "RELEASE-1.1.1.8",
              "blocker": 3,
              "critical": 4,
              "major": 30,
              "minor": 3,
              "UnitTestsTotal": 59,
              "FailedTests": 0,
              "CodeCoverage": 90
            },
            {
              "appName": "App 4",
              "timeStamp": "2018-05-25T00:01:01.001Z",
              "GitTag": "RELEASE-1.1.1.6",
              "blocker": 3,
              "critical": 4,
              "major": 30,
              "minor": 3,
              "UnitTestsTotal": 59,
              "FailedTests": 0,
              "CodeCoverage": 90
            }

  ]

  $scope.appNames = Array.from(new Set($scope.tableData.map(a => a.appName)));;

  $scope.expanding = {};
  for (index = 0; index < $scope.appNames.length; index++) {
    $scope.expanding[$scope.appNames[index]] = false;
  }

  $scope.swapExpanding = function(name) {
    $scope.expanding[name] = !$scope.expanding[name];
  }

}

请帮助我,因为我是 javascript 和 angular js 的新手。非常感谢根据 appName 键和最新时间​​戳过滤我的 angularjs 代码中的数组的任何帮助。提前致谢。

【问题讨论】:

    标签: javascript angularjs json


    【解决方案1】:

    使用reduce按名称分组,内部有一个测试来比较时间戳:

    const appDescription=[{"appName":"App 1","timeStamp":"2018-05-28T00:01:01.001Z","GitTag":"RELEASE-1.0.1.24","blocker":3,"critical":4,"major":30,"minor":3,"UnitTestsTotal":59,"FailedTests":0,"CodeCoverage":90},{"appName":"App 1","timeStamp":"2018-05-27T00:01:01.001Z","GitTag":"RELEASE-1.0.1.23","blocker":3,"critical":4,"major":30,"minor":3,"UnitTestsTotal":59,"FailedTests":0,"CodeCoverage":90},{"appName":"App 2","timeStamp":"2018-05-26T00:01:01.001Z","GitTag":"RELEASE-1.0.1.22","blocker":3,"critical":4,"major":30,"minor":3,"UnitTestsTotal":59,"FailedTests":0,"CodeCoverage":90},{"appName":"App 2","timeStamp":"2018-05-28T00:01:01.001Z","GitTag":"RELEASE-1.0.1.3","blocker":3,"critical":4,"major":30,"minor":3,"UnitTestsTotal":59,"FailedTests":0,"CodeCoverage":90},{"appName":"App 2","timeStamp":"2018-05-26T00:01:01.001Z","GitTag":"RELEASE-1.0.1.2","blocker":3,"critical":4,"major":30,"minor":3,"UnitTestsTotal":59,"FailedTests":0,"CodeCoverage":90},{"appName":"App 3","timeStamp":"2018-05-27T00:01:01.001Z","GitTag":"RELEASE-1.0.0.9","blocker":3,"critical":4,"major":30,"minor":3,"UnitTestsTotal":59,"FailedTests":0,"CodeCoverage":90},{"appName":"App 3","timeStamp":"2018-05-25T00:01:01.001Z","GitTag":"RELEASE-1.0.0.8","blocker":3,"critical":4,"major":30,"minor":3,"UnitTestsTotal":59,"FailedTests":0,"CodeCoverage":90},{"appName":"App 4","timeStamp":"2018-05-28T00:01:01.001Z","GitTag":"RELEASE-1.1.1.8","blocker":3,"critical":4,"major":30,"minor":3,"UnitTestsTotal":59,"FailedTests":0,"CodeCoverage":90},{"appName":"App 4","timeStamp":"2018-05-25T00:01:01.001Z","GitTag":"RELEASE-1.1.1.6","blocker":3,"critical":4,"major":30,"minor":3,"UnitTestsTotal":59,"FailedTests":0,"CodeCoverage":90}];
    const filteredAppsByName = appDescription.reduce((a, app) => {
      const { appName, timeStamp } = app;
      if (
        !a[appName]
        || (new Date(a[appName].timeStamp) < new Date(timeStamp))
      ) a[appName] = app;
      return a;
    }, {});
    const output = Object.values(filteredAppsByName);
    console.log(output);

    【讨论】:

      【解决方案2】:
      • 使用forEach 循环遍历项目
      • 如果数组中不存在数据,则添加它
      • 否则比较时间戳,如果满足条件,则用新数据替换旧数据

      var x = { "data": [{ "appDetails": [{ "appDescription": [{ "appName": "App 1", "timeStamp": "2018-05-28T00:01:01.001Z", "GitTag": "RELEASE-1.0.1.24", "blocker": 3, "critical": 4, "major": 30, "minor": 3, "UnitTestsTotal": 59, "FailedTests": 0, "CodeCoverage": 90 }, { "appName": "App 1", "timeStamp": "2018-05-27T00:01:01.001Z", "GitTag": "RELEASE-1.0.1.23", "blocker": 3, "critical": 4, "major": 30, "minor": 3, "UnitTestsTotal": 59, "FailedTests": 0, "CodeCoverage": 90 }, { "appName": "App 2", "timeStamp": "2018-05-26T00:01:01.001Z", "GitTag": "RELEASE-1.0.1.22", "blocker": 3, "critical": 4, "major": 30, "minor": 3, "UnitTestsTotal": 59, "FailedTests": 0, "CodeCoverage": 90 }, { "appName": "App 2", "timeStamp": "2018-05-28T00:01:01.001Z", "GitTag": "RELEASE-1.0.1.3", "blocker": 3, "critical": 4, "major": 30, "minor": 3, "UnitTestsTotal": 59, "FailedTests": 0, "CodeCoverage": 90 }, { "appName": "App 2", "timeStamp": "2018-05-26T00:01:01.001Z", "GitTag": "RELEASE-1.0.1.2", "blocker": 3, "critical": 4, "major": 30, "minor": 3, "UnitTestsTotal": 59, "FailedTests": 0, "CodeCoverage": 90 }, { "appName": "App 3", "timeStamp": "2018-05-27T00:01:01.001Z", "GitTag": "RELEASE-1.0.0.9", "blocker": 3, "critical": 4, "major": 30, "minor": 3, "UnitTestsTotal": 59, "FailedTests": 0, "CodeCoverage": 90 }, { "appName": "App 3", "timeStamp": "2018-05-25T00:01:01.001Z", "GitTag": "RELEASE-1.0.0.8", "blocker": 3, "critical": 4, "major": 30, "minor": 3, "UnitTestsTotal": 59, "FailedTests": 0, "CodeCoverage": 90 }, { "appName": "App 4", "timeStamp": "2018-05-28T00:01:01.001Z", "GitTag": "RELEASE-1.1.1.8", "blocker": 3, "critical": 4, "major": 30, "minor": 3, "UnitTestsTotal": 59, "FailedTests": 0, "CodeCoverage": 90 }, { "appName": "App 4", "timeStamp": "2018-05-25T00:01:01.001Z", "GitTag": "RELEASE-1.1.1.6", "blocker": 3, "critical": 4, "major": 30, "minor": 3, "UnitTestsTotal": 59, "FailedTests": 0, "CodeCoverage": 90 } ] }] }] };
      
      var filtered_x = [];
      x["data"][0]["appDetails"][0]["appDescription"].forEach(function(itm) {
        var index = filtered_x.findIndex(function(iitt) {
          return itm["appName"] == iitt["appName"];
        });
        if (index == -1) {
          filtered_x.push(itm);
        } else if(new Date(filtered_x[index]["timeStamp"]) < new Date(itm["timeStamp"])){
          filtered_x[index] = itm;
        }
      });
      
      console.log(filtered_x)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-21
        相关资源
        最近更新 更多