在Angular JS中跳过重复JSON排序

当我使用ng-repeat(可能是一种无痛的方式)时,有没有人知道如何完全跳过 JSON排序?

例如,我的源JSON看起来像这样 –

{ "title": "Title", "description": "Description", "moreInfo": "Moreinformation" } 

一旦我在ng-repeat中使用它,它就按字母顺序排序。 像这样的东西 –

 { "description": "Description", "moreInfo": "Moreinformation", "title": "Title" } 

我的ng-repeat看起来像这样 –

 
{{key}} {{data}}

我见过人们有一个单独的键数组,并使用它们来识别JSON对象,最终避免按字母顺序排序。

有一种优雅的方式来做到这一点?

谷歌小组发现了很好的解决方法:

  
 key: {{key}} value: {{value}} 

在范围内:

  $scope.data = { 'key4': 'data4', 'key1': 'data1', 'key3': 'data3', 'key2': 'data2', 'key5': 'data5' }; $scope.notSorted = function(obj){ if (!obj) { return []; } return Object.keys(obj); } 

工作: http : //jsfiddle.net/DnEXC/

原文: https : //groups.google.com/forum/#!topic / angular / N87uqMfwcTs

这个使用filter的答案最适合我。

https://groups.google.com/d/msg/angular/N87uqMfwcTs/EGoY6O2gtzsJ

http://jsfiddle.net/er52h/1/

 angular.module('myFilters', []) .filter('keys', function() { return function(input) { if (!input) { return []; } return Object.keys(input); } }); 

你可以像这样使用:

 

我使用这种方法来覆盖字母顺序:

控制器

 $scope.steps = { "basic-settings": "Basic Settings", "editor": "Editor", "preview-and-publish": "Preview & Publish" }; // NOTE I realise this is a hacky way, but I need to override JS's alphabetical ordering $scope.stepsKeys = _.keys($scope.steps); $scope.activeStep = 0; 

请注意_.keys($ scope.steps); LoDash代替Object.keys();

HTML

 
  • {{ steps[key] }}

目前没有优雅的方法来做到这一点。 原因是 – ngRepeat创建了一个关联数组,它被调用而不是JSON本身。 虽然ECMAScript标准提到:

必须保留对象属性的声明顺序,并且迭代必须以相同的顺序发生。

但不知何故,Angular家伙忽略了它。 这可能会在以后的版本中得到纠正。

我仍然认为Angular的行为更有意义。 由于对象通常比arrays具有更多的初始化逻辑,我认为假设订单通常可能不是用户实际想要/期望的那样是公平的,因此强制进行特定排序可确保正确的行为 – 特别是当我们还必须处理时与较旧的浏览器。