2016-09-19 2 views
1

У меня есть таблица, созданная ngRepeat от переменной первая. По фильтру вместо first.id_second он выписывает second.name, и он отлично работает. Теперь я пытаюсь сортировать столбец first.id_second, и я хочу, чтобы он был отсортирован не по first.id_second, но по second.name. Это моя структура:Заказывающий фильтр AngularJSBy, заказывая одну переменную другой

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'); 

Я не знаю, как фильтровать по свойству, которое из другой переменной. Я полагаю, что я должен написать собственный фильтр, но до сих пор он не был успешным.

Любые идеи? Thanx.

+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 фильтры и OrderBy я уже использую, это было бы только приветствовать :)