【问题标题】:Angularjs filter complex JSON by arrayAngularjs按数组过滤复杂的JSON
【发布时间】:2016-10-22 21:30:26
【问题描述】:

我有一个带有多选选项的下拉列表。我想从基于该数组的复杂 JSON 中过滤掉数据。

选定的选项形成一个数据数组,例如:

$scope.myval=["Adyar","Paris","central"];

我的 JSON :

$scope.myTest={     
    "buslist":
        {
        "code":"1",
        "message":"Success",
        "fromStationCode":"71",
        "searchResult":[        {
        "arrivalTime":"17:00:00",
        "availableSeats":"42",
        "boardingPointDetails":[{
        "code":"1631",
        "name":"Koyambedu",
        "time":"09:30:00"
        },
        {
        "code":"961296",
        "name":"Paris",
        "time":"09:45:00"
        }
        ]
        ]
        },

         {
        "arrivalTime":"18:00:00",
        "availableSeats":"32",
        "boardingPointDetails":[{
        "code":"2084",
        "name":"Adyar",
        "time":"09:30:00"
        },
        {
        "code":"961296",
        "name":"Madurai",
        "time":"09:45:00"
        }
        ]
        ]
        }
        }
        ...
    };

我的 HTML 模板是:

                <tbody ng-repeat=" i in myTest.buslist.searchResult" >
                <tr>
                    <td>{{i.arrivalTime}}</td>
                    <td>{{i.availableSeats}}</td>

                    <td>
                    <p ng-repeat="m in i.boardingPointDetails">{{m.name}}</p>
                    </td>
                </tr>
            </tbody>

我想根据所选值过滤我的数据。我曾尝试过这样的事情:

$scope.matched = $scope.myTest.buslist.searchResult.boardingPointDetails.name.indexOf(data);

即:选择的选项必须与“boardingPointDetails”中的“name”字段匹配,但它会失败。提前致谢。

【问题讨论】:

    标签: arrays angularjs json filter


    【解决方案1】:

    因为$scope.myTest.buslist.searchResult.boardingPointDetails 是一个数组 $scope.myTest.buslist.searchResult.boardingPointDetails.name 无效。

    你需要使用一个数组函数来得到正确的结果:

    $scope.matched = $scope.myTest.buslist.searchResult.boardingPointDetails.filter(function(el) {
       return el.name === data;
    }).length > 0;
    

    编辑:

    由于您的 cmets,我了解您希望获得与 data 选项之一具有相同 name 属性的 boardPointDetails。其中data 是一个字符串数组。

    这样就可以了:

    $scope.matched = $scope.myTest.buslist.searchResult.boardingPointDetails.filter(function(el) {
       return data.indexOf(el.name) === 1;
    });
    

    【讨论】:

    • data 包含什么?它的结构是什么?
    • 数据不过是选定的选项。它是数组格式。$scope.myval=["Adyar","Paris","central"];
    • 所以数据是一个字符串数组。条件是什么?所有这些值都需要在boardingPointDetails 中吗?还是只是其中之一?
    • boardingPointDetails 与数组中的任何一个值匹配应显示为输出。
    • 对我的回答添加了编辑。请注意,$scope.matched 将保存匹配的整个对象。在您的示例中,它将是:{ "code":"961296", "name":"Paris", "time":"09:45:00" }
    猜你喜欢
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多