Получить индекс элемента после использования фильтра
у меня есть массив с объектами. Я хочу найти индекс конкретного объекта. Этот объект имеет уникальный id
значение свойства, и я могу найти его с $filter
:
var el = $filter('filter')( tabs, { id: id })[0]; // "el" is my unique element
но как я могу знать, что индекс этого элемента в исходном массиве? Делает $filter
можете предоставить мне эту информацию?
к настоящему времени я не нашел углового решения, потому что я не могу получить много полезной информации о на этой странице. Поэтому я использовал Array
' s indexOf
метод :
var el_index = tabs.indexOf( el );
чтобы получить индексы всех элементов с конкретными id
идем аналогичным путем:
$scope.getTabsIndexes = function(id){
var els = $filter('filter')( tabs , { id: id });
var indexes = [];
if(els.length) {
var last_i=0;
while( els.length ){
indexes.push( last_i = tabs.indexOf( els.shift() , last_i ) );
}
}
return indexes;
}
но это слишком долго и я уверен, что я изобретать колесо здесь...
3 ответов
попробовать такой вариант:
$scope.search = function(selectedItem) {
$filter('filter')($scope.tabs, function(item) {
if(selectedItem == item.id){
$scope.indexes.push( $scope.tabs.indexOf(item) );
return true;
}
return false;
});
}
Я думаю, что это немного коротко и ясно.
посмотреть Скрипка
не уверен, зачем вам нужен исходный индекс, но вы можете добавить исходный индекс как новое свойство к самому объекту. Например: напишите фильтр, чтобы добавить idx:
angular.module('yourModule', [])
.filter('addId', [function() {
return function(arrObj) {
for (var i = 0; i < arrObj.length; ++i) {
arrObj[i].$$originalIdx = i;
}
return arrObj;
};
}]);
тогда вы можете получить это выражение в html:
{{ tabs | addIdx | filter:{id: 777} }}
или в javascript:
$scope.getTabIndex = function(id){
var el = $filter('filter')( addId(tabs) , { id: id })[0];
var el_index = el.$$originalIdx;
return el_index;
};
как-то я не могу заставить его работать на jsfiddle, похоже, у него проблемы с инъекцией зависимостей..