Используя AngularJS, как я мог бы рандомизировать порядок коллекции?

Как вы упорядочиваете список предметов в AngularJS в случайном порядке? Я думал, что встроенный фильтр orderBy будет работать, но я не уверен, как без добавления некоторых дополнительных данных в модель. Что-то вроде бы здорово.

item in items | orderBy:random

Моя следующая мысль заключалась в создании настраиваемого фильтра, но я бы предпочел избежать этого, если есть что-то еще более доступное.

Ответ 1

orderBy может принимать параметр функции, как и array.sort, поэтому вы можете использовать свой HTML выше и определить функцию random в области видимости, например:

$scope.random = function(){
    return 0.5 - Math.random();
};

Это возвращает случайное значение, иногда отрицательное, иногда положительное, иногда 0, которое будет случайным образом сортировать массив.

Ответ 2

Выполнение метода быстрой скрипки sh0ber, похоже, хорошо работает: http://jsfiddle.net/owenmead/fa4v8/1/

<div ng-controller="MyCtrl">
  <p ng-repeat="i in list|orderBy:random">{{i}}</p>
</div>

function MyCtrl($scope) {
  $scope.list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
  $scope.random = function() {
    return 0.5 - Math.random();
  }
}

Angular orderBy использует сортировку JavaScript() в копии списка. Глядя на другой ответ, некоторые браузеры стабильны в своем роде, другие - нет. Возможно, просто протестируйте скрипку в нескольких браузерах, и вам должно быть хорошо идти: Array.sort Сортировка стабильности в разных браузерах

PS. Не могу прокомментировать ответ sh0ber, так как у меня нет 50 rep