当未定义属性时,Angularjs Filter无法正常工作

Dan*_*nev 5 javascript angularjs angularjs-filter

我有以下设置

  $scope.array = 
    [
      {propertyA: "test", 
       propertyB: {
                   propertyC: [true, true, false]
                  }
      },
      {propertyA: "test2"},
      {propertyA: "test3"}
    ]
Run Code Online (Sandbox Code Playgroud)

然后

<div ng-repeat="item in array| filter :{propertyB: ''} :true">
     {{item.propertyA}}
</div>
Run Code Online (Sandbox Code Playgroud)

所以问题是:

  1. 此设置不显示任何内容

  2. 如果我换到|filter :{propertyB: '!!'} :true它不显示任何东西

  3. 如果我改变|filter :{propertyB: undefined} :true它显示一切

我无法弄明白.

目标:我想显示具有propertyB未定义的项目,而在其他情况下则显示相反的项目.

编辑1:如果我迭代这个数组与angular.equals(item.propertyB, undefined)我得到false, true, true

编辑2:jsfiddle UPDATED

编辑3:我已经更新了问题

Dan*_*nev 0

我最终做了这个。

.filter('undefinedProperties', ['$filter', function ($filter) {
        var checkProperty = function (property, returnUndefined) {
            if (returnUndefined) {
                if (property !== undefined) {
                    return true;
                } else {
                    return false;
                }
            } else {
                if (property === undefined) {
                    return true;
                } else {
                    return false;
                }
            }
        };
        return function (input, propertyArray, returnUndefined) {
            if (angular.isArray(propertyArray)) {
                if (angular.isArray(input) && input.length > 0) {
                    angular.forEach(propertyArray, function (property) {
                        for (var i = input.length; i-- > 0;) {
                            if (checkProperty(input[i][property], returnUndefined)) {
                                input.splice(i, 1);
                            }
                        }
                    });
                }
                return input;
            } else {
                throw "PropertyArray is not an array";
            }
        };
    }])
Run Code Online (Sandbox Code Playgroud)