AngularJs에서 ng-repeat로 (키, 값)을 필터링하는 방법은 무엇입니까?


113

나는 다음과 같은 것을 시도하고 있습니다.

<div ng-controller="TestCtrl">
    <div ng-repeat="(k,v) in items | filter:hasSecurityId">
        {{k}} {{v.pos}}
    </div>
</div>

AngularJs 부분 :

function TestCtrl($scope) 
{
    $scope.items = {
                     'A2F0C7':{'secId':'12345', 'pos':'a20'},
                     'C8B3D1':{'pos':'b10'}
                   };

    $scope.hasSecurityId = function(k,v)
    {
       return v.hasOwnProperty('secId');
    }
}

하지만 왠지 모든 항목을 보여주고 있습니다. (키, 값)을 어떻게 필터링 할 수 있습니까?


항목에 대한 몇 가지 예제 데이터를 제공하십시오. 아니면 우리에게 바이올린을 줘;)
Robin Drexler

이것은 문서 에서 필터를 만드는 방법이 아니며 Robin이 말했듯이 예를 들어주세요.
Yahya KACEM 2013

이미 전체 예제를 제공했으며 필터 사용 방법을 알고 있습니다. "(key, value)로 필터를 사용하는 방법"을 묻고 있습니다.
Vural

인덱스 및 개수는 해당 범위에서 사용할 수 있어야합니다. iirc
Shanimal 2013

답변:


131

Angular 필터 는 Angular 의 API에서 객체가 아닌 배열에만 적용 할 수 있습니다.

"배열에서 항목의 하위 집합을 선택하고 새 배열로 반환합니다."

여기에는 두 가지 옵션이 있습니다.
1) $scope.items배열 로 이동 하거나
-2) ng-repeat다음과 같이 항목을 사전 필터링합니다 .

<div ng-repeat="(k,v) in filterSecId(items)">
    {{k}} {{v.pos}}
</div>

그리고 컨트롤러에서 :

$scope.filterSecId = function(items) {
    var result = {};
    angular.forEach(items, function(value, key) {
        if (!value.hasOwnProperty('secId')) {
            result[key] = value;
        }
    });
    return result;
}

jsfiddle : http://jsfiddle.net/bmleite/WA2BE/


9
무한 (다이제스트) 루프를 방지하려면이 접근 방식에주의해야합니다. 6054705를 참조하십시오 . 요약 : 요약 하자면 ng-repeat에서 컬렉션을 반환하는 함수를 사용하는 것은 안티 패턴입니다. 컬렉션을 범위 속성에 할당하고이를 반복하는 것이 좋습니다.
Joe23 2014

3
유용한 댓글. 이것은 나를 루프로 던졌습니다. 나는 필터링 할 것으로 예상 어떤 반복자를. 고맙습니다. :)
크리스 Krycho

3
참고 : 이것은 현재 성능 방지 패턴입니다. Angular 1.3에는 현재 상태 비 저장 필터 ( egghead.io/lessons/… )가 있으므로이를위한 필터를 만들고 싶을 것입니다.
kentcdodds

8
@kentcdodds는 무료가 아닌 링크를 게시하지 않습니다!
세바스찬

11
반복되는 요소에 ng-if를 추가하지 않는 이유는 무엇입니까?
CarbonDry 2015

45

내 솔루션은 사용자 지정 필터를 만들고 사용하는 것입니다.

app.filter('with', function() {
  return function(items, field) {
        var result = {};
        angular.forEach(items, function(value, key) {
            if (!value.hasOwnProperty(field)) {
                result[key] = value;
            }
        });
        return result;
    };
});

그리고 html에서 :

 <div ng-repeat="(k,v) in items | with:'secId'">
        {{k}} {{v.pos}}
 </div>

1
그러나 n * n 번 반복됩니다.
maxisam

27

또한 다음 ng-repeat과 함께 사용할 수 있습니다 ng-if.

<div ng-repeat="(key, value) in order" ng-if="value > 0">

2
영리한. 이것은 많은 시간을 절약했습니다.
Safwan


11

angular.filter 모듈을 사용하기 만하면 중첩 된 속성으로도 필터링 할 수 있습니다.
참조 : jsbin
2 예 :

JS :

angular.module('app', ['angular.filter'])
  .controller('MainCtrl', function($scope) {
  //your example data
  $scope.items = { 
    'A2F0C7':{ secId:'12345', pos:'a20' },
    'C8B3D1':{ pos:'b10' }
  };
  //more advantage example
  $scope.nestedItems = { 
    'A2F0C7':{
      details: { secId:'12345', pos:'a20' }
    },
    'C8B3D1':{
      details: { pos:'a20' }
    },
    'F5B3R1': { secId:'12345', pos:'a20' }
  };
});

HTML :

  <b>Example1:</b>
  <p ng-repeat="item in items | toArray: true | pick: 'secId'">
    {{ item.$key }}, {{ item }}
  </p>

  <b>Example2:</b>
  <p ng-repeat="item in nestedItems | toArray: true | pick: 'secId || details.secId' ">
    {{ item.$key }}, {{ item }}
  </p> 

21
당신은 그것이 angular.filter핵심 앵귤러 모듈이 아니며 당신이 그것의 저자 임을 밝혀야 합니다.
demisx

toArray필터가 더 이상 존재하지 않는 것 같습니다 . filter필터가 여전히 개체를 허용하지 않기 때문에 교체 가 있습니까?
trysis

6

다소 늦었지만 비슷한 필터를 찾고 다음과 같은 것을 사용하여 끝냈습니다.

<div ng-controller="TestCtrl">
 <div ng-repeat="(k,v) in items | filter:{secId: '!!'}">
   {{k}} {{v.pos}}
 </div>
</div>

2
어떻게 작동하게 되었습니까? 반복되는 객체와 함께 필터를 사용할 때 Angular 문서에서 예상되는 기준 인 오류가 발생합니다.
tonestrike

1

이 질문은 다소 오래되었지만 angular 1 개발자를위한 솔루션을 공유하고 싶습니다. 요점은 원래 각도 필터를 재사용하지만 모든 객체를 배열로 투명하게 전달하는 것입니다.

app.filter('objectFilter', function ($filter) {
    return function (items, searchToken) {
        // use the original input
        var subject = items;

        if (typeof(items) == 'object' && !Array.isArray(items)) {
            // or use a wrapper array, if we have an object
            subject = [];

            for (var i in items) {
                subject.push(items[i]);
            }
        }

        // finally, apply the original angular filter
        return $filter('filter')(subject, searchToken);
    }
});

다음과 같이 사용하십시오.

<div>
    <input ng-model="search" />
</div>
<div ng-repeat="item in test | objectFilter : search">
    {{item | json}}
</div>

여기 플런 커가 있습니다


0

이미 여러 프로젝트에서 사용한 일반 필터를 조금 더 만들었습니다.

  • object = 필터링해야하는 개체
  • field = 필터링 할 객체 내의 필드
  • filter = 필드와 일치해야하는 필터의 값

HTML :

<input ng-model="customerNameFilter" />
<div ng-repeat="(key, value) in filter(customers, 'customerName', customerNameFilter" >
   <p>Number: {{value.customerNo}}</p>
   <p>Name: {{value.customerName}}</p>
</div>

JS :

  $scope.filter = function(object, field, filter) {
    if (!object) return {};
    if (!filter) return object;

    var filteredObject = {};
    Object.keys(object).forEach(function(key) {
      if (object[key][field] === filter) {
        filteredObject[key] = object[key];
      }
    });

    return filteredObject;
  };
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.