2014-02-07 47 views
0

嗨在我的控制器從服務器我得到一個JSON字符串AngularJS訂單JSON陣列和內部陣列

$scope.unsorted=data; 

而且數據看起來像

[ 
    { 
    "configId": 116, 
    "configName": "LAND_LINE", 
    "configFieldses": [ 
     { 
     "FieldId": 784, 
     "FieldName": "engine.form.1", 
     "values": [ 
      { 
      "keyname": "formName", 
      "value": "Account Number", 
      "id": 3068 
      }, 
      { 
      "keyname": "formValuePosition", 
      "value": "right", 
      "id": 3069 
      } 
     ] 
     }, 
     { 
     "FieldId": 783, 
     "FieldName": "engine.form.0", 
     "values": [ 
      { 
      "keyname": "formName", 
      "value": "Amount", 
      "id": 3074 
      }, 
      { 
      "keyname": "formValuePosition", 
      "value": "right", 
      "id": 3075 
      }, 
      { 
      "keyname": "regexGazatteer", 
      "value": "Total Charges :", 
      "id": 3076 
      } 
     ] 
     }, 
     { 
    "FieldId": 785, 
     "FieldName": "engine.table2", 
     "values": [ 
      { 
      "keyname": "regexTableHeaderStart", 
      "value": null, 
      "id": 3079 
      }, 
      { 
      "keyname": "regexTableBodyEnd", 
      "value": null, 
      "id": 3080 
      }, 
      { 
      "keyname": "tableName", 
      "value": "invoice", 
      "id": 3078 
      } 
     ] 
     } 
    ] 
    } 
] 

我想基礎上,configFieldses數組進行排序FieldId以及values陣列中的每個configFieldses基於id。因此,JSON應該看起來像

[ 
    { 
    "configId": 116, 
    "configName": "LAND_LINE", 
    "configFieldses": [ 
     { 
     "FieldId": 783, 
     "FieldName": "engine.form.0", 
     "values": [ 
      { 
      "keyname": "formName", 
      "value": "Amount", 
      "id": 3074 
      }, 
      { 
      "keyname": "formValuePosition", 
      "value": "right", 
      "id": 3075 
      }, 
      { 
      "keyname": "regexGazatteer", 
      "value": "Total Charges :", 
      "id": 3076 
      } 
     ] 
     }, 
     { 
     "FieldId": 784, 
     "FieldName": "engine.form.1", 
     "values": [ 
      { 
      "keyname": "formName", 
      "value": "Account Number", 
      "id": 3068 
      }, 
      { 
      "keyname": "formValuePosition", 
      "value": "right", 
      "id": 3069 
      } 
     ] 
     }, 

     { 
    "FieldId": 785, 
     "FieldName": "engine.table2", 
     "values": [ 
      { 
      "keyname": "tableName", 
      "value": "invoice", 
      "id": 3078 
      } 
      { 
      "keyname": "regexTableHeaderStart", 
      "value": null, 
      "id": 3079 
      }, 
      { 
      "keyname": "regexTableBodyEnd", 
      "value": null, 
      "id": 3080 
      } 
     ] 
     } 
    ] 
    } 
] 

我已經試過是第一個排序父數組,然後孩子陣列。

var sortedfieldses = orderByFilter($scope.unsorted.configFieldses, '+FieldId'); 

但後來如何remoive從無序配置舊陣列,並添加新無序。還有如何循環遍歷每一個然後對其進行排序?

什麼是最好的方法?

回答

2

第1步:複製對象,然後應用自定義排序功能。

var sortedfieldses = angular.copy($scope.unsorted.configFieldses); 

sortedfieldses.sort(function(a, b){ 
    return a.FieldId > b.FieldId; 
}); 

第2步:通過「fieldses」迭代和他們的孩子進行排序:

angular.forEach(sortedfieldses, function(field, key){ 

    field.values.sort(function(a, b){ 
     return a.id > b.id; 
    }); 
}); 

其實重新閱讀你的問題,這聽起來好像你只是想排序在「未分類」對象而不是複製到「排序」變量。如果是這樣的情況下,跳過對象拷貝,只是做:

$scope.unsorted.configFieldses.sort(function(a, b){ 
    return a.FieldId > b.FieldId; 
}); 

angular.forEach($scope.unsorted.configFieldses, function(field, key){ 

    field.values.sort(function(a, b){ 
     return a.id > b.id; 
    }); 
}); 

的排序方法改變了原來的數組,而不是簡單地返回排序的副本。

0

如果您只需要對數組進行排序,你可以這樣做

$scope.unsorted=data; 

    // sort the parent 
    $scope.unsorted[0].configFieldses.sort(function(config1, config2) { 
     return config1.FieldId - config2.FieldId; 
    }); 

    // sort the child values 
    $scope.unsorted[0].configFieldses.forEach(function(configField){ 
     console.log(configField.values); 

     configField.values.sort(function(value1, value2) { 
      return value1.id - value2.id; 
     }); 

    }); 

但是,如果你想用NG-重複和排序依據過濾器顯示的數據,你可以做使用嵌套NG重複像這樣。

<div ng-controller="ControllerX"> 
     <div ng-repeat="configField in unsorted[0].configFieldses | orderBy:'FieldId' "> 
      <h3>{{configField.FieldId}}, {{configField.FieldName}}</h3> 
      <ul> 
       <li ng-repeat="value in configField.values | orderBy:'id'"> 
        {{value.id}}, {{value.keyname}} 
       </li> 
      </ul> 
     </div> 
    </div>