如何过滤对象数组?

时间:2016-04-29 18:58:48

标签: javascript jquery angularjs

我有这个数组:

$scope.damageEvants =
    [
       {"id":2, "StartDate":21/05/2012, EndDate:null},
       {"id":3, "StartDate":null, EndDate:02/09/2014},
       {"id":4, "StartDate":null, EndDate:null},
       {"id":5, "StartDate":21/05/2012, EndDate:null}
    ];

我想从属性startDate和EndDate为null的数组中过滤(删除)所有对象。

过滤后的结果:

$scope.damageEvants =
    [
       {"id":2, "StartDate":21/05/2012, EndDate:null},
       {"id":3, "StartDate":null, EndDate:02/09/2014},
       {"id":5, "StartDate":21/05/2012, EndDate:null}
    ];

我试过了:

$scope.damageEvants.filter(return item.StartDate!== null && item.EndDate !== null  )

但这似乎是错误的方式。

如何使用过滤功能过滤$scope.damageEvants

6 个答案:

答案 0 :(得分:3)

$scope.damageEvants.filter(return item.StartDate!== null && item.EndDate !== null )

应该是

$scope.damageEvants.filter(function(item) {
     return item.StartDate!== null && item.EndDate !== null;
});

filter

答案 1 :(得分:1)

$scope.damageEvants = $scope.damageEvants.filter(function(item) {
     return item.StartDate!== null && item.EndDate !== null;
});

答案 2 :(得分:1)

只需检查是否设置了日期。

var array = [{ "id": 2, "StartDate": '21/05/2012', EndDate: null }, { "id": 3, "StartDate": null, EndDate: '02/09/2014' }, { "id": 4, "StartDate": null, EndDate: null }, { "id": 5, "StartDate": '21/05/2012', EndDate: null }],
    result = array.filter(function (a) {
        return a.StartDate || a.EndDate;
    });

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

ES6版

var array = [{ "id": 2, "StartDate": '21/05/2012', EndDate: null }, { "id": 3, "StartDate": null, EndDate: '02/09/2014' }, { "id": 4, "StartDate": null, EndDate: null }, { "id": 5, "StartDate": '21/05/2012', EndDate: null }],
    result = array.filter(a => a.StartDate || a.EndDate);

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

答案 3 :(得分:1)

正如Sushanth的回答所示,.filter()期望接收一个函数值,该函数返回一个布尔值,用于确定当前数组成员是否在过滤后的数组中。您的代码正在过滤一个布尔值而不是函数值。

答案 4 :(得分:1)

另一种选择是在angular.forEach循环中拼接对象。这实际上会从原始数组中删除对象,而不是创建新数组。

示例:https://jsfiddle.net/gh03zur4/

<强>控制器

0 <= B <= M

基于Sushanth的答案的另一个选择是在ng-repeat列表中应用过滤器,如下所示:

https://jsfiddle.net/qj7dz2eq/

<强>控制器

M

<强> HTML

        function Controller($scope) {
      $scope.damageEvants = [{
        "id": 2,
        "StartDate": 21 / 05 / 2012,
        EndDate: null
      }, {
        "id": 3,
        "StartDate": null,
        EndDate: 02 / 09 / 2014
      }, {
        "id": 4,
        "StartDate": null,
        EndDate: null
      }, {
        "id": 5,
        "StartDate": 21 / 05 / 2012,
        EndDate: null
      }];

      angular.forEach($scope.damageEvants, function(event) {
        if (!event.EndDate && !event.StartDate) {
          var idx = $scope.damageEvants.indexOf(event);
          $scope.damageEvants.splice(idx, 1);
        }
      });
    }

执行上述任一方法都可以防止同一个数组绑定到$ scope两次。

答案 5 :(得分:1)

可以尝试:

$scope.damageEvants = $scope.damageEvants.filter(function(obj) {
    return !(obj.StartDate === obj.EndDate && obj.StartDate === null);
});