Использование Array.Sort без использования обоих значений в массиве - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть такой массив:

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 0,7 . Я не могу изменить версию.

Я думал о том, чтобы извлечь логику из AngularJS и просто отсортировать массив в javascript , но я застреваю, потому что он сортируется по значениям в массиве, а не по другому значению.

Например, я пробовал это с пользовательской сортировкой, но я хочу сравнивать только один индекс за раз. Я не хочу перебирать каждую пару вещей для сортировки. Я только хочу использовать a из функции, а не оба a и b.

(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 ]

3 голосов
/ 23 апреля 2019

Вы можете найти индекс value в order. Было бы проще, если бы order было array, но если оно должно быть строкой, вы все равно можете посмотреть индекс в строках.

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);
3 голосов
/ 23 апреля 2019

Вы можете взять 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; }
1 голос
/ 23 апреля 2019

Почему бы вам не добавить другое свойство, такое как SortOrder, и присвоить ему числа от 0 ... N в том порядке, в котором вы хотите их видеть (скомпилируйте свои 1,3,2 до 0,1,2), а затем использовать этополе как поле orderBy без какой-либо специальной логики?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...