2016-09-19 55 views
1

我有一個由ngRepeat從變量開始的第一個。通過過濾器,而不是first.id_second它寫出second.name,它很好。現在我正在嘗試對列first.id_second進行排序,我希望它不按first.id_second排序,而是通過second.name排序。這是我的結構:AngularJS過濾器順序通過另一個排序一個變量

var first = [{ 
    "id": 0, 
    "id_second": "111" 
},{ 
    "id": 1, 
    "id_second": "222" 
}] 

var second = [{ 
    "id_second": "111", 
    "name": "name1" 
},{ 
    "id_second": "222", 
    "name": "name2" 
}] 

通常情況下,在我的HTML我會

ng-click="order('col_name')" 

並在控制器

$scope.order = function(predicate) { 
    $scope.predicate = predicate; 
    $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false; 
    $scope.first = orderBy($scope.first, predicate, $scope.reverse); 
}; 

var orderBy = $filter('orderBy'); 

我不知道怎麼用這是一個屬性過濾來自另一個變量。我想我應該寫一個自定義過濾器,但到目前爲止它並沒有成功。

任何想法?感謝名單。

+0

只是一個建議,爲什麼不是使用lo-dash,而是使用[_.sortBy](https://lodash.com/docs/3.10.1#sortBy)而不是角度的「$ filter」服務 - 它具有更大的靈活性? – MiTa

+0

我不喜歡爲我需要的一個「小」事物使用額外的庫,特別是如果這意味着重寫這個項目已有的大部分代碼。 – ljerka

回答

0

看來,沒有辦法做到這一點簡單,所以最後我寫了一個自定義的orderBy函數,其中我實現了quicksort。

// arranging data from second to get to the data easier 
var secondKeyVal = {}; 
for (var i = 0; i < $scope.second.length; i++) { 
    secondKeyVal[$scope.second[i].id_second] = $scope.second[i].naziv; 
} 

// function that is called from html 
$scope.orderByCustom = function(predicate) { 
    $scope.predicate = predicate; 
    $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false; 
    $scope.orderByCustomSort(); 
}; 

$scope.orderByCustomSort= function() { 
    var sorted = quickSort($scope.first); 
    $scope.first = sorted; 
}; 

function quickSort(a) { 
    if (a.length <= 1) return a; 
    var left=[], right=[], pivot=secondKeyVal[a[0].id_second]; 
    for (var i = 1; i < a.length; i++) { 
     secondKeyVal[a[i].id_second] <= pivot ? left.push(a[i]) : right.push(a[i]); 
    } 

    return quickSort(left).concat(a[0], quickSort(right)); 
} 

Ofcourse,如果有人設法拉了這一點,而無需使用額外的庫,這將使我不得不改變HTML過濾器和排序依據我已經使用了,這將是最歡迎:)