javascript - (Angular.js) 如何通过过滤器计算数组中有多少项?

标签 javascript angularjs

在 Angular JS 中,我有一个变量来跟踪人们及其年龄

$scope.people = [
    {
        name: "Lucy",
        age: "18"
    }, {
        name: "Michael",
        age: "24"
    }, {
        name: "Lisa",
        age: "46"
    }
];

用户可以通过简单的表单添加更多人:

<input ng-model="newPerson.name">
<input ng-model="newPerson.age">
<button ng-click="addNewPerson()">Add</button>

在页面底部,我想要一个简单的饼图,按年龄组显示人口,例如(>18、18-25、26-35、36-45、45<)。为此,我需要能够按年龄过滤 $scope.people,获取每个组的人数。

我知道我可以使用普通的 JavaScript 来循环整个数组,获取每个年龄组的计数。每当添加一个新人时,只需增加该特定组中的计数,但我想知道是否有一种更有效且更 Angular 方法来做到这一点?

最佳答案

这是使用 Array.Prototype.filter 实现此目的的一种方法和 Array.Prototype.reduce 。请注意,过滤器应用于 $scope.ageBrackets,其中包含由 forEach 循环准备的预处理数据。这对于小范围值(例如人的年龄)非常有效。如果您不使用 ng-repeat 并且不想多次过滤数据,这是一种替代方案。

angular.module('ageBracketApp', ['ageBracketApp.controllers']);
angular.module('ageBracketApp.controllers', []).controller('ageBracketController', ['$scope',
  function($scope) {

    $scope.ageBrackets = [];

    $scope.people = [{
      name: "Lucy",
      age: "18"
    }, {
      name: "Michael",
      age: "24"
    }, {
      name: "Lisa",
      age: "46"
    }];

    angular.forEach($scope.people, function(value, key) {
      $scope.ageBrackets[value.age] = $scope.ageBrackets[value.age] + 1 || 1;
    });

    $scope.addPerson = function() {
      var age = Math.floor(Math.random() * (123 - 1 + 1)) + 1; // random between 1 and 123
      $scope.people.push({
        name: 'Person ' + ($scope.people.length + 1),
        age: age
      });
      $scope.ageBrackets[age] = $scope.ageBrackets[age] + 1 || 1;

    };

    $scope.ageBracketCount = function(min, max) {
      max = max || Number.MAX_SAFE_INTEGER;
      return $scope.ageBrackets.filter(function(value, index, array) {
        return index >= min && index <= max;
      }).reduce(function(a, b) {
        return a + b;
      }, 0);
    };
  }
]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="ageBracketApp" ng-controller="ageBracketController">
  {{people}}
  <hr />18+: {{ageBracketCount(18)}}
  <br />18-25: {{ageBracketCount(18,25)}}
  <br />26-35: {{ageBracketCount(26,35)}}
  <br />40-: {{ageBracketCount(0,40)}}
  <hr />
  <button ng-click="addPerson()">
    Add person
  </button>
</div>

关于javascript - (Angular.js) 如何通过过滤器计算数组中有多少项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36853834/

相关文章:

javascript - navigator.notification.* 失败 "navigator.notification [undefined] is not an object"

javascript - 如何使用闭包编译器将 js 注释保留在原处?

javascript - 在指令中,ng-click 多次触发 angularjs

javascript - 在 Angular 2 中以编程方式加载和卸载模块

javascript - 函数是否被自动调用

javascript - 什么 VsCode 主题可以在 html 属性上启用漂亮的手写字体?

javascript - 您可以在 JavaScript 中使用自定义原型(prototype)创建函数吗?

angularjs - 如何使用 ui-router 检查身份验证并自动重定向到登录状态?

javascript - 模型更新不会动态传播

javascript - 如何在 AngularJS ng-click 触发器之前设置超时