如何在angularjs中对foreach中的这个数值数组进行排序?

时间:2014-07-11 04:39:49

标签: javascript angularjs angularjs-ng-repeat

我在控制器中有以下范围:

for(x = 1; x <= 15; x++)
{
  x = parseInt(x);
  Scope.numArr[x] = x;
}

在视图中,我使用以上范围“numArr”,

的下拉框
<select data-ng-model="printValue" ng-options="v for (k,v) in numArr| 
                        orderBy:'number()': reverse=false"> 
 <option value="">Print options</option>
</select>

因为无法对这个简单的数组进行排序,我正撞墙而去。正如Angularjs doc中提到的,它是整数数组而不是字符串类型。什么是最简单的Angular表达式,以自然顺序显示值,如1,2,3,4,5 ... 15。

目前,Angularjs会自动对下拉框进行排序并显示为1,11,12 ... 15,2,3 ......等。

PHP或Python 中,如果我使用上面的数组,我将按照我在数组中指定的相同顺序获取下拉列表并且没有头疼。在AnguarJs,事情是奇怪的。这句话只是为了表明事情应该尽可能简单,这是程序员喜欢的。

我坚信 AngularJS团队已将这些简单的数组值显示复制到下拉框中的自动排序列表。如果团队尽可能保持简单,那就太好了。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

orderBy filter can only be used on Arrays,而不是对象数据源。

话虽这么说,您可以轻松创建自定义过滤器,将对象哈希转换为数组:

   app.filter('toArray', function() { 
        return function(data) { 
           var array = [];
           for(var d in data) {
              array.push({key:d, value:data[d]});
           }

           return array;
        }
   });

然后,您可以将过滤器应用于对象数据源:

<body ng-app="app" ng-controller='MyController'> 
    <div ng-repeat="item in arr | toArray | orderBy: 'key':true">
        {{item.key}}{{item.value}}
    </div>
</body>

toArray过滤器将对象数据源转换为具有键和值属性的对象文字数组。然后orderBy按照指定为第二个参数的属性(&#39; key&#39;或&#39; value&#39;)对结果数组进行排序。最后,第三个参数指定是否反转数组。

在选择中使用

<select data-ng-model="printValue" ng-options="item.key as item.value for item in arr | toArray | orderBy: 'key':true"> 
 <option value="">Print options</option>
</select>

答案 1 :(得分:0)

试试这个:

Controller.js:

    vm.number = 0;
    vm.sample = [];

 function activate() {
       return common.activateController([getNumber()], controllerId)
              .then(function () {
              });
    }

function getNumber(){
   for (var i = 0; i <= 15; i++) {
            i = parseInt(i);
            vm.sample.push({ number: i });
        }
 }

View.html

  <select data-ng-model="vm.number" data-ng-options="num.number as num.number for num in vm.sample | orderBy:'number'">
</select>

答案 2 :(得分:0)

试试这个

未排序

<强> Working Demo

HTML

<select data-ng-model="printValue">
        <option value="">Print options</option>
        <option ng-repeat="key in notSorted(numArr)" ng-init="value = numArr[key]" value="{{key}}">{{value}}</option>
</select>

脚本

 var DemoApp = angular.module("DemoApp", []);
 DemoApp.controller("DemoController",

 function DemoController($scope) {
     $scope.numArr = {};
     for (var x = 1; x <= 15; x++) {
         x = parseInt(x);
         $scope.numArr[x] = x;
     }

     $scope.notSorted = function (obj) {
         if (!obj) {
             return [];
         }
         return Object.keys(obj);
     }
 });

非排序但逆序

如果您想要撤销订单,请尝试以下

<强> Working Demo

<option ng-repeat="key in notSorted(numArr).slice().reverse()" ng-init="value = numArr[key]" value="{{key}}">{{value}}</option>