Tengo un objeto con una serie de propiedades de los objetos que se encuentra en la siguiente estructura similar (que es la forma en que los datos viene de regreso de un servicio):

{
  "1": {
    "type": "foo",
    "name": "blah"
  },
  "2": {
    "type": "bar"
  },
  "3": {
    "type": "foo"
  },
  "4": {
    "type": "baz"
  },
  "5": {
    "type": "test"
  }
}

Cuando hago un ng-repeat, me puede iterar sobre todos los 5 de estos objetos, algo así como:

<div ng-repeat="item in items">{{item.type}}</div>

Sin embargo, lo que realmente quiero hacer es repetir sólo sobre aquellos elementos que NO son el tipo de «foo», es decir, 3 iteraciones en lugar de 5. Sé que los filtros de alguna manera puede ser aprovechado para hacer esto, pero no estoy seguro de cómo. He intentado lo siguiente:

<div ng-repeat="item in items| !filter:{type:'foo'}">{{item.type}}</div>

pero esto no funciona. De hecho, incluso a limitar a solo 2 objetos(aquellos con el artículo.tipo===»foo»), no funciona y hace 5 iteraciones:

<div ng-repeat="item in items| filter:{type:'foo'}">{{item.type}}</div>

En esencia, yo quiero hacer algo similar a:

<div ng-repeat="item in items" ng-if="item.type !=='foo'>{{item.type}}</div>

Sin embargo, sé que no te funcione.

InformationsquelleAutor Conqueror | 2013-11-08

6 Comentarios

  1. 16

    Filtro funciona en las matrices, pero tiene un literal de objeto.

    Así que usted puede convertir su literal de objeto en una matriz o crear su propio filtro que lleva en el objeto literal.

    Si usted no necesita los valores de índice, a continuación, convertir a una matriz puede ser su mejor apuesta(
    Aquí un violín con la matriz de trabajo: http://jsfiddle.net/NqA8d/3/):

    $scope.items = [{
        "type": "foo",
            "name": "blah"
    }, {
        "type": "bar"
    }, {
        "type": "foo"
    }, {
        "type": "baz"
    }, {
        "type": "test"
    }];

    En caso de que quiera hacer un filtro, aquí es una manera de hacer que:

    myApp.filter('myFilter', function () {
        return function (items, search) {
            var result = [];
            angular.forEach(items, function (value, key) {
                angular.forEach(value, function (value2, key2) {
                    if (value2 === search) {
                        result.push(value2);
                    }
                })
            });
            return result;
    
        }
    });

    Y que el violín: http://jsfiddle.net/NqA8d/5/

    • Veo a Hugo acaba de publicar un filtro que es un poco mejor partido para sus datos. Evita la segunda vuelta, sabiendo cómo se estructuran sus datos.
    • Yo iterado mi objeto empujando a cada uno de los subsectores objeto en una matriz basada en la condición de que tipo===»foo» y, a continuación, evitar el tema de filtrado completo. Con la información que el filtro sólo funciona en la matriz fue muy útil para mí, gracias.
  2. 45

    Poco tarde para responder, pero esto podría ayudar a :

    Si desea filtrar en un nieto (o más profundo) de un objeto dado, puede continuar la construcción de su objeto de jerarquía. Por ejemplo, si desea filtrar por ‘cosa.propiedades.título», puede hacer lo siguiente:

    <div ng-repeat="thing in things | filter: { properties: { title: title_filter } }">

    También puede filtrar por múltiples propiedades de un objeto sólo por la adición de ellos a su objeto de filtro:

    <div ng-repeat="thing in things | filter: { properties: { title: title_filter, id: id_filter } }">

    La sintaxis de ‘no equivale a’ es sólo un poco apagado, intente lo siguiente:

    <div ng-repeat="thing in things | filter: { properties: { title: '!' + title_filter } }">
    • Esta es la mejor respuesta, en mi opinión.
    • Creo que este fue añadido en la v1.3. Sin duda el método más fácil ahora.
    • Estoy seguro de que esto es lo que estoy buscando, pero no estoy seguro de la gn-modelo para poner el cuadro de entrada. Se puede también especificar lo que puede parecer así?
    • Esta es la mejor respuesta. Gracias.
    • Mejor tarde que nunca… Mejor respuesta..
    • ¿cómo es posible actualización de $scope.las cosas en el mando para usarlo en otro lugar? var filteredThings = $filter('$scope.properties.title')($scope.things); throughs una err.
    • Puede usted proporcionar un plnkr ? Vamos a ver si puedo ayudarte 🙂
    • oh gracias encontré la solución. Que debo usar algo como esto: var filteredThings = $filter('filter')($scope.things,$scope.properties.title);
    • Este no me funciona con Angular 1.5.8 tengo el siguiente ng-repeat: <tr ng-repeat="item in messages | filter: { properties: { name: searchQuery } }" id="{{::item.name}}"> pero obtengo el siguiente error: Error: [filter:notarray] Expected array but received: {"ACK":{"name":"ACK","description":"General Acknowledgment","class":"standard","checked":false},"ACK_A01":{"name":"ACK_A01","description":"General Acknowledgment - Admit/Visit Notification","class":"standard","checked":false},...
    • Sería grande si usted puede proporcionar un violín para el mismo. Sería más fácil de entender.

  3. 16

    Aunque estoy de acuerdo en que la conversión de su objeto puede ser la mejor opción aquí, también puede utilizar esta función de filtro:

    angular.module('app').filter('objectByKeyValFilter', function () {
    return function (input, filterKey, filterVal) {
        var filteredInput ={};
         angular.forEach(input, function(value, key){
           if(value[filterKey] && value[filterKey] !== filterVal){
              filteredInput[key]= value;
            }
         });
         return filteredInput;
    }});

    como este:

    <div ng-repeat="(key, value) in data | objectByKeyValFilter:'type':'foo'">{{key}}{{value.type}}</div> 

    Véase también el Plunker.

    • Esto fue muy útil, gracias! Terminé cambiando a filtrar cosas que coinciden, en lugar de no coincidencia. No sé por qué algo así no se construye en Angular todavía. Ojalá me equivoque en que a pesar de que 🙂
  4. 4

    Probar este(en el controlador):

    $scope.notFooFilter = function(item)
    {
        return (item.type !== 'foo');
    };

    Y en el lenguaje de marcado HTML:

    <div ng-repeat="item in items| filter:notFooFilter">{{item.type}}</div>
    • Intenté algo similar anteriormente, mediante la creación de un filtro personalizado en el ctrl que imprime un registro de la consola, a continuación, devuelve el obj, pero parece que mis filtros no están incluso teniendo efecto, ya que ninguno de mis registros, donde cada vez impreso.
    • Me encontré con un problema: el filtro se trabaja con la matriz, ver docs – docs.angularjs.org/api/ng.filter:filter , y este trabajo violín jsfiddle.net/4YLH3/2
    • Ser cuidadosos con esto. Usted no será capaz de utilizar !, debe crear otra función, en caso de que usted utilice !, se hará angular para devolver resultados extraños, en algún momento que el trabajo y otras veces que no. <div ng-repeat=»elemento de artículos| filtro:!notFooFilter»>{{item.tipo}}</div>
    • He encontrado esta solución después de mucho tiempo. Ayuda más para mi la funcionalidad. $scope.onetoTwentyFilter = function(elemento) { return ((elemento.precio >1) && elemento.precio < 20); };
  5. 0

    No hay necesidad de todo eso. Esta solución funciona bien sin tener que convertir o crear su propio filtro:

     {{myModel.userSelectedHour["Start"]}}

    Por lo tanto, objeto.[«propiedad»] en lugar de objeto.propiedad.

  6. 0

    Probar este a objeto de filtro

    var rateSelected = $filter('filter')($scope.GradeList, function (obj) {
                            if(obj.GradeId == $scope.contractor_emp.save_modal_data.GradeId)
                            return obj;
                    });

Dejar respuesta

Please enter your comment!
Please enter your name here