2015-09-24 92 views
1

當我用angularJS範圍排序依據並不孩子排序,只是父

$scope.data = $filter('orderBy')(data,'title'); 

家長進行排序,孩子們都沒有。

如果我的數組有孩子該怎麼辦?我如何訂購父母和孩子?

我的數組:

data = [ 
     { 
     "id": 1, 
     "title": "abc", 
     "items": [ 
      { 
      "id": 3, 
      "title": "abc2", 
      "items": [] 
      }, 
      { 
      "id": 4, 
      "title": "abc1", 
      "items": [] 
      } 
     ] 
     }, 
     { 
     "id": 2, 
     "title": "cde", 
     "items": [ 
      { 
      "id": 5, 
      "title": "cde2", 
      "items": [] 
      }, 
      { 
      "id": 6, 
      "title": "cde1", 
      "items": [] 
      } 
     ] 
     } 
    ]  

在此先感謝。

+0

你最會做的時間來看....但是如果您要排序的數據源必須遍歷各個層次,這些層次 – charlietfl

+0

我需要在原有範圍進行排序。我怎麼能在每個級別上訂購?我的陣列中有6個關卡。提前致謝! – David

+0

需要遞歸函數來遍歷每個級別。你爲什麼需要這樣做?如果需要的話,如果可行的話,可以考慮按順序發送它。再次...它也可以在視圖中排序 – charlietfl

回答

2

它不應該對兒童物體內的任何東西進行排序。 對於在子對象內進行排序,對於每個孩子,使用$ filter('orderBy')或類似的代碼對您的'項目'進行遞歸排序,使用您自己的自定義比較函數。

var orderByFieldName = 'title', 
    childPropertyForSorting = 'items', 
    s = function (a, b) { 
     //Revise comparing function depends on direction of sorting and your wishes 
     if (a[orderByFieldName] > b[orderByFieldName]) 
      return 1; 
     if (a[orderByFieldName] < b[orderByFieldName]) 
      return -1; 

     return 0; 
    }, 
    f = function (o) { 
     if (o.hasOwnProperty(childPropertyForSorting) && o[childPropertyForSorting] instanceof Array) { 
      o[childPropertyForSorting].sort(s); 
      o[childPropertyForSorting].forEach(f); 
     } 
    }; 

if (originalData instanceof Array) { 
    originalData.sort(s); 
    originalData.forEach(f); 
} 
+0

非常感謝這個解決方案!它非常完美!它命令我在樹上的所有孩子。但我的樹上有6個級別的孩子。這種解決方案將是完整的排序它們?先謝謝你! – David

+1

此解決方案將排序任何級別的數量。如果孩子擁有Array的屬性'項目'實例。 –

1

我建議,如果你只是想排序依據的視圖中的使用

數據-NG-重複=「數據項|排序依據:‘你要科拉姆’」

Read more about it here

+0

我也考慮過這個解決方案,確實非常好。唯一的問題是我需要對原始範圍進行排序。有了這個解決方案,只是視圖得到排序,而原始範圍則不是。提前致謝! – David

1

原因是孩子們是在另一個電平,就視爲該對象內的另一個關鍵值對,可以使用你內部的用於循環的相同的過濾器,將環中的各數據數組項和孩子排序像這樣:

//filter the parent level by title 
$scope.data = $filter('orderBy')(data,'title'); 
//copy the sorted array in temp variable 
var temp = angular.copy($scope.data); 
//sort the children by title while aggregating each array item and then storing the output in $scope. 
for(var i=0;i<data.length;i++){ 
     $scope.data[i].items = $filter('orderBy')(temp[i].items,'title'); 
} 
+0

問題是我的代碼中最多隻能有6層兒童(「物品」)。這樣,我不會失去使用'for'的表現嗎?有沒有辦法將排序應用於所有兒童級別,而不需要鏈接'for'?提前致謝! – David