【问题标题】:Angularjs : how to orderBy an array without keys?Angularjs:如何订购一个没有键的数组?
【发布时间】:2015-10-08 13:40:45
【问题描述】:

我有一个数组,其中每一行如下所示:

array = [[ 'A2', 'A3', 'X' ], [ 'A1', 'Z', 'VZZ' ]]

数组没有键。 目前我只是通过值的位置(即数组[0]、数组[1]等)访问这些值,它工作正常。

但是我想按第一个值对行进行排序。

如何在 angularJs 中做到这一点?

我尝试过... | orderBy:$index 但它不起作用。

【问题讨论】:

  • 使用 Array.sort(function(){})
  • 您是在 html 中迭代它吗?如果有 html 可以显示吗?
  • 我没有准确地说,但我正在使用 ngRepeat 迭代数组(这就是我写“... | orderBy...”的原因,我希望排序是动态的,所以我这样做了不想要静态排序

标签: javascript arrays angularjs


【解决方案1】:

只是香草Array.sort!

非常基本的例子!

var arr = [[ 'A2', 'A3', 'X' ], [ 'A1', 'Z', 'VZZ' ] ,  [ 'A4', 'P', 'VZZ' ]  , [ 'A3', 'X', 'VZZ' ]];


console.dir( arr.sort(function(a , b){ return a[0] < b[0]} );

【讨论】:

    【解决方案2】:

    我不知道在这种情况下如何使用 orderBy,但您可以使用这样的自定义过滤器:

    假设你的标记是这样的:

    <div ng-repeat="item in array">
    </div>
    

    现在,添加一个像这样的自定义过滤器:

    <div ng-repeat="item in array | customOrder">
    </div>
    

    现在像这样定义过滤器:

    app.filter('customOrder', function() {
        return function(collection) {
            //collection is your complete array
            //sort the collection
            collection.sort(function(a, b) {
                return a[0] - b[0]; //sort the collection using the first element of the array
            }) 
    
            //finally returned the sorted collection
            return collection;
        }
    })
    

    【讨论】:

      【解决方案3】:

      您不需要像其他答案建议的自定义排序功能,也不需要在使用之前在 vanilla JS 中对其进行排序。

      你可以这样排序:

      ... | orderBy: 'this[1]'
      

      按第二个(索引 1)元素排序。

      你也可以只加一个减号来反转它:

      ... | orderBy: '-this[1]'
      

      这是一个例子:

      var app = angular.module('helloworld', []);
      app.controller('TestController', function () {
          var test = this;
          this.orderIndex = 'this[1]';
          this.data = [
              [ 'A2', 'A3', 'X' ],
              [ 'A1', 'Z', 'VZZ' ]
          ];
      });
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.min.js"></script>
      <table ng-app="helloworld" ng-controller="TestController as test" border="1" cellspacing=0 cellpadding=3>
        <tbody>
          <tr ng-repeat="row in test.data | orderBy:test.orderIndex">
            <td ng-repeat="column in row">{{ column }}</td>
          </tr>
        </tbody>
      </table>

      编辑

      我不能让它只操作数字,但是当我放置一个变量而不是整个orderBy 条件时,它就可以工作。您可以将整个部分 this[0] 替换为变量并自行操作。

      所以现在你必须找到一种方法来操作这个字符串。

      请检查上面编辑的 sn-p 以了解想法。

      希望这会有所帮助。

      【讨论】:

      • 不错!它看起来像我正在寻找的解决方案。但是,我现在正在研究如何传递参数而不是固定值。有什么建议吗?
      • 你回答得太快了@dragoste :) 我无法传递参数,如下所示: {{ column }} 你知道这样做的语法是什么吗?
      【解决方案4】:

      定义一个函数供 orderBy 使用,它返回每个子数组的第一个元素

      早先帖子中的示例here

      【讨论】:

        【解决方案5】:

        如果您像您说的那样在 html 上进行迭代,您可以使用 orderBy 并执行以下操作:

        HTML:

        <div ng-controller="MyCtrl">
            <div ng-repeat="val in array | orderBy:mySortFunction">{{val}}</div>
        </div>
        

        控制器:

        function MyCtrl($scope) {
            $scope.array = [[ 'A2', 'A3', 'X' ],[ 'A1', 'Z', 'VZZ' ]];
        
            $scope.mySortFunction = function(v) {
               return v[0];
            };
        }
        

        Fiddle

        【讨论】:

          【解决方案6】:

          一个像你的例子一样照顾字母数字比较的解决方案:

          array = [[ 'A2', 'A3', 'X' ], [ 'A1', 'Z', 'VZZ' ]];
          
          //pattern that takes care of alphanumeric
          var reA = /[^a-zA-Z]/g;
          var reN = /[^0-9]/g;
          console.log(array.sort(function(a,b){
          
              
              var aA = a[0].replace(reA, "");
              var bA = b[0].replace(reA, "");
              if(aA === bA) {
                  var aN = parseInt(a[0].replace(reN, ""), 10);
                  var bN = parseInt(b[0].replace(reN, ""), 10);
                  return aN === bN ? 0 : aN > bN ? 1 : -1;
              } else {
                  return aA > bA ? 1 : -1;
              }
          }))

          【讨论】:

            【解决方案7】:

            我无权评论@dragoste 的回复,但我把它放在这里。

            @Cheyenne55,要通过视图添加参数,您需要将其添加到控制器的 $scope 中(允许您直接从视图访问它),在下面的示例中,您可以通过选择器选择参数:

            JS:

            $scope.parameterOptions = [{
                'title':'first',
                'reference': 0
            },{
                'title':'second',
                'reference': 1
            },{
                'title':'third',
                'reference': 2
            }];
            
            $scope.parameterOptions = $scope.parameterOptions[0];
            

            HTML:

            <select ng-model="selectedParameter" ng-options="option.title for option in parameterOptions"></select>
            
            <tr ng-repeat="row in test.data | orderBy:'-this[selectedParameter.reference]'"> <td ng-repeat="column in row">{{ column }}   </td> 
            

            【讨论】:

              【解决方案8】:

              实际上,由于您的几个答案,我找到了解决方案。

              当我写信给@dragoste 时,我正在寻找的是在 ngRepeat 的 orderBy 子句中使用“'this[0]'”。

              但是,我还有另一个要求是使用于对数组进行排序的位置动态化,即。而不是 "'this[0]'" 我需要 "'this[index]'" 其中 index 是一个 var。

              但是经过测试,我发现你不能在那个特定的地方传递一个var,因为完整的句子实际上是这样的:

               ngRepeat="rows in row | orderBy:'this[0]'"
              

              要解决这个问题,你需要这样写:

               ngRepeat="rows in row | orderBy:index"
              

              并将其放入您的控制器中:

               $scope.index = 'this[' + position + ']';
              

              通过 ng-click 或其他方式设置 var 位置的位置

              【讨论】:

                猜你喜欢
                • 2014-05-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-09-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多