Упорядочить порядок объектов внутри $ scope

0

Мне интересно, возможно ли изменять порядок объектов внутри области. У меня есть $scope.movies И теперь область видимости упорядочена по идентификатору. Поэтому, когда я консоль регистрирую $scope.movies он выглядит так,

{"id":1,"title":"The Town","release_date":"2010-10-21","image":"/zX4fKmDXKGt4hlzhAJirdlRKFgO.jpg","user_id":null,"created_at":"2015-12-04T19:57:58.449Z","updated_at":"2015-12-04T19:57:58.449Z","movie_id":"23168","imdb_rating":"7.6"},
{"id":2,"title":"Interstellar","release_date":"2014-11-06","image":"/nBNZadXqJSdt05SHLqgT0HuC5Gm.jpg","user_id":null,"created_at":"2015-12-04T19:58:16.600Z","updated_at":"2015-12-04T19:58:16.600Z","movie_id":"157336","imdb_rating":"8.7"},
{"id":3,"title":"Django Unchained","release_date":"2013-01-16","image":"/5WJnxuw41sddupf8cwOxYftuvJG.jpg","user_id":null,"created_at":"2015-12-04T20:00:22.411Z","updated_at":"2015-12-04T20:00:22.411Z","movie_id":"68718","imdb_rating":"8.5"},
{"id":4,"title":"Moonrise Kingdom","release_date":"2012-05-30","image":"/uw88gWDC0W7AAEhMeQmtdXFV7yR.jpg","user_id":null,"created_at":"2015-12-04T20:00:41.054Z","updated_at":"2015-12-04T20:00:41.054Z","movie_id":"83666","imdb_rating":"7.8"},
{"id":5,"title":"Gone Girl","release_date":"2014-10-01","image":"/gdiLTof3rbPDAmPaCf4g6op46bj.jpg","user_id":null,"created_at":"2015-12-05T09:05:08.424Z","updated_at":"2015-12-05T09:05:08.424Z","movie_id":"210577","imdb_rating":"8.2"}

Но я хочу упорядочить данные по дате выпуска, так что это будет выглядеть так,

{"id":1,"title":"The Town","release_date":"2010-10-21","image":"/zX4fKmDXKGt4hlzhAJirdlRKFgO.jpg","user_id":null,"created_at":"2015-12-04T19:57:58.449Z","updated_at":"2015-12-04T19:57:58.449Z","movie_id":"23168","imdb_rating":"7.6"},
{"id":4,"title":"Moonrise Kingdom","release_date":"2012-05-30","image":"/uw88gWDC0W7AAEhMeQmtdXFV7yR.jpg","user_id":null,"created_at":"2015-12-04T20:00:41.054Z","updated_at":"2015-12-04T20:00:41.054Z","movie_id":"83666","imdb_rating":"7.8"},
{"id":3,"title":"Django Unchained","release_date":"2013-01-16","image":"/5WJnxuw41sddupf8cwOxYftuvJG.jpg","user_id":null,"created_at":"2015-12-04T20:00:22.411Z","updated_at":"2015-12-04T20:00:22.411Z","movie_id":"68718","imdb_rating":"8.5"},
{"id":5,"title":"Gone Girl","release_date":"2014-10-01","image":"/gdiLTof3rbPDAmPaCf4g6op46bj.jpg","user_id":null,"created_at":"2015-12-05T09:05:08.424Z","updated_at":"2015-12-05T09:05:08.424Z","movie_id":"210577","imdb_rating":"8.2"}
{"id":2,"title":"Interstellar","release_date":"2014-11-06","image":"/nBNZadXqJSdt05SHLqgT0HuC5Gm.jpg","user_id":null,"created_at":"2015-12-04T19:58:16.600Z","updated_at":"2015-12-04T19:58:16.600Z","movie_id":"157336","imdb_rating":"8.7"},

Можно ли изменить порядок объектов внутри $ scope с помощью javascript?

Я использовал orderBy release_date в моем ng-repeat. Но для моей структуры html мне пришлось помещать фильмы в строки. Используя это,

$scope.toRows = function(arr, total){
  var i = 0, rows = [];
  while(i < arr.length){
    i % total == 0 && rows.push([]);
    rows[rows.length-1].push(arr[i++])
  }
  return rows
};
$scope.moviesRows = $scope.toRows($scope.movies, 6);

И тогда orderBy больше не работает, потому что он помещает первые элементы $scope.movies в строки, а затем делает orderBy на объектах в строках. Поэтому он сначала помещает все объекты по порядку идентификатора в строки, а затем упорядочивает объекты в строке с помощью release_date.

* РЕДАКТИРОВАТЬ *

Предполагается, что порядок выхода JSON не имеет значения, как Angular помещает объекты.

array.sort(function(a,b){
  return new Date(b.release_date) - new Date(a.release_date);
});

Заказы по дате выпуска в объекте, а также в консоли. Но Angular по-прежнему помещает объекты в ID.

  • 0
    Как вы хотите их отобразить /?
  • 0
    Я объяснил это немного больше в вопросе. Я не могу использовать orderBy, потому что я помещаю свои результаты в строки таблицы. В этой ситуации ng-repeat сначала размещает объекты по идентификатору в строке, а затем фильтрует объекты в этой строке по дате выпуска.
Теги:

1 ответ

1
Лучший ответ

Вы можете использовать фильтр orderBy для достижения желаемого. Взгляните на: https://docs.angularjs.org/api/ng/filter/orderBy

В любом случае, если вы делаете много манипуляций с коллекциями, вам лучше взглянуть на одну из нескольких хороших библиотек для этого, например UnderscoreJS, Lodash и т.д.

Я использую Lodash для этого, но это просто предпочтение.

КАК ДОПОЛНИТЕЛЬНЫЕ ТРЕБОВАНИЯ:

Вы должны заказать массив, прежде чем делить его на chancks, чтобы наложить фильтр на фильтр и сделать следующее:

var orderBy = $filter('orderBy');
$scope.orderedMovies = orderBy($scope.movies, "release_date", false);
$scope.moviesRows = $scope.toRows($scope.orderedMovies, 6);
  • 0
    Я не могу использовать orderBy . Для моей структуры HTML я хочу разместить каждые 6 элементов в строке таблицы. Итак, что Angular делает, это берет первые 6 объектов, размещает их в ряд и затем выполняет orderBy. Затем возьмите второй набор из 6 объектов, поместите их во второй ряд и выполните заказ по. Так что сначала он заказывает по ID, а затем по дате выпуска.
  • 0
    Я вижу, что вы пытаетесь сделать, но я получаю ошибку. TypeError: Cannot read property 'length' of undefined
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню