【问题标题】:Using Array.Sort without using both values in array使用 Array.Sort 而不使用数组中的两个值
【发布时间】:2019-09-12 20:49:17
【问题描述】:

我有一个这样的数组:

var array = [{value: 1, text:"one"},{value: 2, text:"two"},{value: 3, text:"three"}]

我想根据这个变量对其进行排序:var order = '1,3,2';

意思是,它将按照1,3,2 的顺序排列,其中它由数组中对象的value 属性排序。

我在 AngularJS ng-repeat 数组中使用它,但我无法在 orderBy 上使用自定义比较,因为我使用的是版本 1.2.14,它出现在 1.5.7 中。我无法更改版本。

我曾想过从 AngularJS 中提取逻辑并仅在 javascript 中对数组进行排序,但由于它基于数组中的值而不是另一个值进行排序而陷入困境。

例如,我尝试过使用自定义排序,但我只想一次比较一个索引。我不想遍历每一对事物进行排序。我只想使用函数中的a,而不是ab

(function() {
  var app = angular.module('test', []);

  app.controller("test", function($scope) {
    $scope.selectedOption = {};

    $scope.availableOptions = [{
      value: 1,
      text: "one"
    }, {
      value: 2,
      text: "two"
    }, {
      value: 3,
      text: "three"
    }];

    $scope.availableOptions.sort(sortOptions);
  });

  var sortOptions = function(a, b) {
    var sortBy = '1,3,2';

    var values = sortBy.split(',');
    for (val in values) {
      v = parseInt(val);
      if (v === a.value) {
        return 0;
      } else if (v < a.value) {
        return -1;
      } else if (v > a.value) {
        return 1;
      }
    }
  };

})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.14/angular.min.js"></script>

<div ng-app="test" ng-controller="test">
  <select ng-model="selectedOption.value">
    <option ng-repeat="option in availableOptions" value="{{option.value}}">{{option.text}}</option>
  </select>
</div>

我希望下拉列表中的One, Three, Two 按从上到下的顺序排列。有没有办法一次只在数组中使用.sort 和一个值?并且只比较一次?

【问题讨论】:

    标签: javascript angularjs sorting


    【解决方案1】:

    您可以在order 中查找value 的索引。如果orderarray 会更容易,但如果它必须是字符串,那么您仍然可以查找in 字符串的索引。

    let array = [{value: 1, text: "one"}, {value: 2, text: "two"}, {value: 3, text: "three"}];
    let order = [1, 3, 2]; // '1,2,3' will also work
    
    let sorted = array.sort((a, b) => order.indexOf(a.value) - order.indexOf(b.value));
    
    console.log(sorted);

    【讨论】:

    • 谢谢,选择这个是因为我需要支持旧版本的 IE。
    【解决方案2】:

    您可以将Map 用于所需的排序顺序,但您需要两个参数进行排序,因为您需要获取相对顺序。

    var array = [{ value: 1, text: "one" }, { value: 2, text: "two" }, { value: 3, text: "three" }],
        orderStr = '1,3,2',
        order = new Map(orderStr.split(',').map((k, v) => [+k, v]));
    
    array.sort((a, b) => order.get(a.value) - order.get(b.value));
    
    console.log(array);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      您为什么不添加另一个属性,例如 SortOrder,并按照您需要查看它们的顺序从 0...N 分配数字(将您的 1、3、2 编译为 0、1、2) 而不是将该字段用作 orderBy 字段而无需任何特殊的自定义逻辑?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-26
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 2015-01-13
        • 2011-06-21
        • 2021-10-18
        • 2015-03-14
        相关资源
        最近更新 更多