使用Array.Sort而不同时使用array

时间:2019-04-23 15:54:15

标签: javascript angularjs sorting

我有一个像这样的数组:

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版,它在{{3}中发布}。我无法更改版本。

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

例如,我尝试使用自定义排序进行尝试,但是我只想一次比较一个索引。我不想遍历每对事物进行排序。我只想从函数中使用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与数组中的一个值一起使用?而且只能比较一次?

3 个答案:

答案 0 :(得分:3)

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

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);

答案 1 :(得分:3)

您可以将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; }

答案 2 :(得分:1)

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