Мне интересно, возможно ли изменять порядок объектов внутри области. У меня есть $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.
Вы можете использовать фильтр 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);
orderBy
. Для моей структуры HTML я хочу разместить каждые 6 элементов в строке таблицы. Итак, что Angular делает, это берет первые 6 объектов, размещает их в ряд и затем выполняет orderBy. Затем возьмите второй набор из 6 объектов, поместите их во второй ряд и выполните заказ по. Так что сначала он заказывает по ID, а затем по дате выпуска.
TypeError: Cannot read property 'length' of undefined