【问题标题】:How to filter JSON data according to specified parameter AngularJSAngularJS如何根据指定参数过滤JSON数据
【发布时间】:2017-03-26 07:35:40
【问题描述】:

我有外部 JSON 文件调用数据。这是该 JSON 文件的主体。

[
    {"value": "1", "text": "aaa"},
    {"value": "2", "text": "bbb"},
    {"value": "3", "text": "ccc"},
    {"value": "4", "text": "ddd"},
    {"value": "5", "text": "eee"},
    {"value": "6", "text": "fff"},
    {"value": "7", "text": "ggg"},
    {"value": "8", "text": "hhh"},
    {"value": "9", "text": "iii"},
    {"value": "10", "text": "jjj"}
]

我想根据以下数组“b”值过滤此 JSON 文件中的数据。(b0、b1、b3 等)

$scope.array = {"badge":"1,2,5,7","id":"0","b0":"1","b1":"2","b2":"5","b3":"7"}

例子:

这个数组有 b0、b1、b2 和 b3 这些值是 1、2、5 和 7。因此我想从数据 JSON 文件中只获取 1、2、5、7 值数组并显示这个数组的文本值.

此数组可以更改为相同的格式。因此我想考虑 b+"number" 参数。

示例 1:

$scope.array = {"badge":"1,2,3,9","id":"0","b0":"1","b1":"2","b2":"3","b3":"9"}

示例 2:

$scope.array = {"badge":"1,2,7","id":"0","b0":"1","b1":"2","b2":"7"}

示例 3:

$scope.array = {"badge":"1,2,5,7,8,9","id":"0","b0":"1","b1":"2","b2":"5","b3":"7","b4":"8","b5":"9"}

我像这样使用 angularjs 获取 JSON 外部文件,

$http.get("/json/datas.json").success(function(data) {
      $scope.datas= data;
});

使用重复显示值。

<div ng-repeat="data in datas">
    <span ng-bind-html="data.text"></span>
</div>

仅显示 HTML 正文

aaa bbb eee ggg

【问题讨论】:

    标签: javascript angularjs arrays json


    【解决方案1】:

    一种方法是过滤、映射和/或减少具有 "bX" 值的数组以创建 ID 查找表,然后根据该查找表过滤主 data 数组。除了那个“数组”不是一个数组,它是一个普通的对象,所以你不能直接在它上面使用数组方法。所以我调用Object.keys() 来获取数组中的键,然后我选择使用.reduce() 根据具有正确格式的键创建查找表:

    var data = [ {"value": "1", "text": "aaa"}, {"value": "2", "text": "bbb"}, {"value": "3", "text": "ccc"}, {"value": "4", "text": "ddd"}, {"value": "5", "text": "eee"}, {"value": "6", "text": "fff"}, {"value": "7", "text": "ggg"}, {"value": "8", "text": "hhh"}, {"value": "9", "text": "iii"}, {"value": "10", "text": "jjj"} ]
    
    var $scope = {} // demo $scope object
    $scope.array = {"badge":"1,2,5,7","id":"0","b0":"1","b1":"2","b2":"5","b3":"7"}
    
    var bVals = Object.keys($scope.array).reduce(function(a, c) {
        if (/^b\d+$/.test(c))
          a[$scope.array[c]] = true
        return a
      }, {})
      
    console.log(bVals)
    
    var filteredData = data.filter(function(v) { return bVals[v.value] })
    
    console.log(filteredData)

    【讨论】:

    • 哇,我不敢相信我没有注意到 badge 属性与单个 bX 属性具有相同的信息。那会简化我的代码。哦,好吧。
    • @nnnnnn 是的,我刚刚看到它的一半:D
    • @Hey - 为什么?我的答案中的代码 sn-p 可以直接从这个页面运行,所以你可以看到它的工作原理。
    【解决方案2】:

    您可以使用 javascript 原型函数 mapfind 来过滤数据。 首先将批次属性获取到一个数组中,并映射该数组以找到相关值

    $scope.array = {"badge":"1,2,3,9","id":"0","b0":"1","b1":"2","b2":"3","b3":"9"}
    var batchArr = $scope.array.badge.split(',');
    $scope.result = batchArr.map(o=> $scope.datas.find(k=> k.value == o)) 
    

    angular.module("app",[])
    .controller("ctrl",function($scope,$sce){
    $scope.datas = [
        {"value": "1", "text": "aaa"},
        {"value": "2", "text": "bbb"},
        {"value": "3", "text": "ccc"},
        {"value": "4", "text": "ddd"},
        {"value": "5", "text": "eee"},
        {"value": "6", "text": "fff"},
        {"value": "7", "text": "ggg"},
        {"value": "8", "text": "hhh"},
        {"value": "9", "text": "iii"},
        {"value": "10", "text": "jjj"}
    ]
    $scope.array = {"badge":"1,2,3,9","id":"0","b0":"1","b1":"2","b2":"3","b3":"9"}
    
    var batchArr = $scope.array.badge.split(',');
    $scope.result = batchArr.map(o=> $scope.datas.find(k=> k.value == o)) 
    
    
    console.log($scope.result)
    
    $scope.trust = function(html){
     return $sce.trustAsHtml(html);
    }
    })
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="app" ng-controller="ctrl">
     <div ng-repeat="data in result">
        <span ng-bind-html="trust(data.text)"></span>
    </div>
    </div>

    【讨论】:

    • @Hey 个人不是 jsfiddle 的粉丝。通过plnkr.co/edit/oag45U7BA2rQMxCIhirr?p=preview 创建了一个 plnkr
    • 你能解释一下吗 o=> $scope.datas.find(k=> k.value == o) 这个。为什么会得到 o 和 k。我们可以使用后者吗?
    • 这些是函数引用的 ES6 语法,如果你使用的是 ES5,那么使用这个$scope.result = batchArr.map(function(o) { return $scope.datas.find(function(k) { return k.value == ol }) })
    • mapfind 是原型函数,它们遍历给定的数组。 ok 是该迭代数组的相关对象
    • o=> $scope.datas.find(k=> k.value == o) 代码在 EI 中不起作用
    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多