使用带有 ng-repeat 的对象数组中的另一个对象的 id 属性 按 id 查找对象

Find object by id using another object's id property from array of objects with ng-repeat

我的范围内有以下数据模型。

        $scope.staff = [
        {"id": "1","name": "Alex"},
        {"id": "2","name": "Brad"},
        {"id": "3","name": "Cam"}
    ];
        $scope.closedShop =[
            {"day": "monday","staffID": "1"},
            {"day": "wednesday","staffID": "2"},
            {"day": "thursday","staffID": "3"},
            {"day": "friday","staffID": "1"}
        ];

我想做的是输出哪位员工每天关门,所以根据上面我的理想输出就是。

Alex 星期一关店

Brad 星期三关店

Cam 星期四关门

亚历克斯周五关店

我遇到的问题是 closedShop 数据只包含 staffID,我如何根据 staff.id 数据查找人员姓名?

我在下面有一个工作示例,但是,对于少数员工来说,这不是一个可扩展的解决方案?

  'use strict';
    var app = angular.module('app', []);
        app.controller('MainCtrl', ['$scope', function ($scope) {
            $scope.staff = [
            {"id": "1","name": "Alex"},
            {"id": "2","name": "Brad"},
            {"id": "3","name": "Cam"}
        ];
            $scope.closedShop =[
                {"day": "monday","staffID": "1"},
                {"day": "wednesday","staffID": "2"},
                {"day": "thursday","staffID": "3"},
                {"day": "friday","staffID": "1"}
            ];
        }]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
    <div ng-controller="MainCtrl">
        <div ng-repeat="closed in closedShop">
            <span ng-if="staff[0].id==closed.staffID">{{staff[0].name}}</span> 
            <span ng-if="staff[1].id==closed.staffID">{{staff[1].name}}</span> 
            <span ng-if="staff[2].id==closed.staffID">{{staff[2].name}}</span> 
            closed the shop on {{closed.day}}
            </div>
    </div>
</div>

实现此功能的最佳方法是什么?

您可以添加到您的控制器函数以获取 staffById。

$scope.getStaff = function(id){find and return}

并改变你的看法:

<div ng-app="app">
    <div ng-controller="MainCtrl">
        <div ng-repeat="closed in closedShop">
            <span>{{getStaff(closed.staffID)}}</span> 
            closed the shop on {{closed.day}}
            </div>
    </div>
</div>

可能这不是您所期望的,但工作正常:

HTML :

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
<div ng-controller="MainCtrl">
    <div ng-repeat="closed in closedShop">

        <span ng-repeat="s in staff" ng-if="s.id==closed.staffID">
          {{s.name}}
        </span>
        closed the shop on {{closed.day}}
        </div>
</div>
</div>
<script src="app.js"></script>

JS:

 var app = angular.module('app', []);
    app.controller('MainCtrl', ['$scope', function ($scope) {
        $scope.staff = [
        {"id": "1","name": "Alex"},
        {"id": "2","name": "Brad"},
        {"id": "3","name": "Cam"}
    ];
        $scope.closedShop =[
            {"day": "monday","staffID": "1"},
            {"day": "wednesday","staffID": "2"},
            {"day": "thursday","staffID": "3"},
            {"day": "friday","staffID": "1"}
        ];
    }]);

看到这个plunkr

这部分是钱:

<span ng-init="person = (staff | filter:{id:closed.staffID}:true)[0]">{{person.name}}</span>

这可能是不言自明的,但我会详细说明以防有帮助。

  • 您想显示单个员工的属性,所以我将从 {{person.name}} 开始。
  • 然后,我们需要得到一个变量person,所以我们需要使用ng-init来创建它。
  • 我们需要将员工数组过滤为一个成员,因此我们通过 closed.staffID 将其过滤掉,使用 "strict" 参数设置为 true 以便我们只获得 ID 匹配的结果.由于过滤语法,此部分需要包含在 ( ) 中。
  • 最后,我们使用 [0] 以便将 person 设置为匹配对象,这将是数组中的第一项(第 0 项)。

    var app = angular.module('app', []);
        app.controller('MainCtrl', ['$scope', function ($scope) {
            $scope.staff = [
            {"id": "1","name": "Alex"},
            {"id": "2","name": "Brad"},
            {"id": "3","name": "Cam"}
        ];
            $scope.closedShop =[
                {"day": "monday","staffID": "1"},
                {"day": "wednesday","staffID": "2"},
                {"day": "thursday","staffID": "3"},
                {"day": "friday","staffID": "1"}
            ];
        }]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
    <div ng-controller="MainCtrl">
        <div ng-repeat="closed in closedShop">
            <span ng-init="person = (staff | filter:{id:closed.staffID}:true)[0]">{{person.name}}</span>
            closed the shop on {{closed.day}}
        </div>
    </div>
</div>

您也可以 ng-init="person = getPerson(closed.staffID)" 并将过滤逻辑移动到控制器中。为此,您将注入过滤器 filter(有趣的名称),如下所示:

app.controller('MainCtrl', ['$scope', 'filterFilter', function ($scope, filter) {

然后使用这个函数:

$scope.getPerson = function(id) {
  return filter($scope.staff, {id:id}, true)[0];
};