使用AngularJS在JSON中搜索特定值

时间:2014-05-30 00:01:29

标签: json angularjs

我试图通过设置为Log: true

的特定属性值来过滤我的JSON对象

如果一个对象将此属性设置为false,我想将其过滤掉。以下是JSON结构的示例:

$scope.Main =
    { 
          "MyBook" :  
          {
            "Title": "The Road",
            "Type" : "Text",
            "Log" : false
          },
          "MyCat":
          {
            "Name" :  "Penny",
            "Type" :  "Pet",
            "Log" : true            
          },
          "Car":
          {
            "Make" :  "Toyota",
            "Model" : "Camry",
            "Type" :  "Vehicle",
            "Log" : false     
          }
    }

如您所见,对象本身并不相似,但它们都包含一个日志属性。

3 个答案:

答案 0 :(得分:1)

<强> Online Demo

这是我在搜索属性值等于 true

时过滤对象的方法
var sampleObj = {/* you sample object*/}; 

var filtered = Object.keys(sampleObj).reduce(function(arr,prop){
    if(Object.keys(sampleObj[prop])
        .filter(function (p) {return p === "Log";})){
            if(sampleObj[prop].Log==true){
                arr.push(sampleObj[prop]);
            }

    }
    return arr;
},[]);
console.log(filtered);

由于您使用的是角度,可能需要使用自定义过滤器:

接近的地方:

自定义过滤器

angular.module('myApp', []).filter('myFilter', function() {
    return function(sampleObj, param1) {
        return Object.keys(sampleObj).reduce(function(arr,prop){
            if(Object.keys(sampleObj[prop])
                .filter(function (p) {return p === "Log";})){
                if(sampleObj[prop].Log==param1){
                    arr.push(sampleObj[prop]);
                }
            }
            return arr;
        },[]);
    };
});

并在 html

 <li ng-repeat="item in sampleObj | myFilter: true">

答案 1 :(得分:0)

尝试使用underscorejs library

您可以使用_.filter_.has等功能来过滤列表。

这是我如何尝试实现该对象的一个​​例子:

var filtered = _.filter($scope.Main, function(obj) {
    return _.has(obj, "Log") && obj.Log;
}

答案 2 :(得分:0)

使用自定义角度滤镜:

.filter('filterLog', function(){
  return function(items){
    for (var item in items) {
      if (items[item].Log === false) delete items[item];
    }
    return items;
  }
})

然后,在您的视图中,您可以输出过滤后的列表,如下所示:

<li ng-repeat="(key, value) in Main | filterLog">{{value}}</li>

如果您需要在控制器中使用它,您可以:

$scope.filtered = $filter('filterLog')($scope.Main);

Demo