¿Cómo puedo obtener una matriz invertida en angular? Estoy tratando de usar el filtro orderBy, pero necesita un predicado (por ejemplo, 'nombre') para ordenar:
<tr ng-repeat="friend in friends | orderBy:'name':true">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
<tr>
¿Hay alguna manera de revertir la matriz original, sin ordenar? como eso:
<tr ng-repeat="friend in friends | orderBy:'':true">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
<tr>
ng-repeat
comportamiento! @Trevor Senior hizo un buen trabajo.Respuestas:
Sugeriría usar un filtro personalizado como este:
Que luego se puede usar como:
Véalo trabajando aquí: Demostración de Plunker
Este filtro se puede personalizar para satisfacer sus necesidades como se ve. He proporcionado otros ejemplos en la demostración. Algunas opciones incluyen verificar que la variable es una matriz antes de realizar el reverso, o hacer que sea más indulgente para permitir la reversión de más cosas como cadenas.
fuente
items.reverse()
modifica la matriz en lugar de simplemente crear una nueva y devolverla.slice()
para resolver ese problema.if (!angular.isArray(items)) return false;
para verificar que tiene una matriz antes de intentar revertirla.Esto es lo que usé:
Actualizar:
Mi respuesta estuvo bien para la versión antigua de Angular. Ahora, deberías estar usando
ng-repeat="friend in friends | orderBy:'-'"
o
de https://stackoverflow.com/a/26635708/1782470
fuente
track by
, esta es la única forma que funcionó para míng-repeat="friend in friends | orderBy:'+': true track by $index"
Perdón por mencionar esto después de un año, pero hay una solución nueva y más fácil , que funciona para Angular v1.3.0-rc.5 y posteriores .
Se menciona en los documentos : "Si no se proporciona ninguna propiedad (por ejemplo, '+'), el elemento de matriz en sí se usa para comparar dónde se ordena". Entonces, la solución será:
ng-repeat="friend in friends | orderBy:'-'"
ong-repeat="friend in friends | orderBy:'+':true"
Esta solución parece ser mejor porque no modifica una matriz y no requiere recursos computacionales adicionales (al menos en nuestro código). He leído todas las respuestas existentes y todavía prefiero esta a ellas.
fuente
v1.3.0-rc.4
). Si alguien tiene la oportunidad de probarlo en la nueva versión, ¡háganoslo saber!v1.3.0-rc.5
( rc.5 docs vs rc.4 docs ). He actualizado la respuestaorderBy:'+':true
,orderBy:'-':true
,orderBy:'-':false
,orderBy:'+':false
:(Puede revertir por el parámetro $ index
fuente
$index
). Estoy en Angular 1.1.5.ng-repeat="friend in friends | orderBy:'id':true"
funciona.Solución simple: - (no es necesario hacer ningún método)
fuente
Simplemente puede llamar a un método en su alcance para revertirlo, de esta manera:
Tenga en cuenta que
$scope.reverse
crea una copia de la matriz ya queArray.prototype.reverse
modifica la matriz original.fuente
si está utilizando 1.3.x, puede usar lo siguiente
Ejemplo Listar libros por fecha de publicación en orden descendente
fuente: https://docs.angularjs.org/api/ng/filter/orderBy
fuente
Si está utilizando angularjs versión 1.4.4 y superior , una forma fácil de ordenar es utilizando el " índice de $ ".
ver demo
fuente
Cuando use MVC en .NET con Angular, siempre puede usar OrderByDecending () al hacer su consulta de db de esta manera:
Luego, en el lado angular, ya se invertirá en algunos navegadores (IE). Cuando sea compatible con Chrome y FF, deberá agregar orderBy:
En este ejemplo, estaría ordenando en orden descendente en la propiedad .Id. Si está utilizando la paginación, esto se vuelve más complicado porque solo se ordenaría la primera página. Tendría que manejar esto a través de un archivo de filtro .js para su controlador, o de alguna otra manera.
fuente
También puedes usar .reverse (). Es una función de matriz nativa.
<div ng-repeat="friend in friends.reverse()">{{friend.name}}</div>
fuente
reverse
invierte la matriz en su lugar, no solo devuelve una copia invertida. Esto significa que cada vez que se evalúa esto, la matriz se invertirá.Eso es porque estás usando el objeto JSON. Cuando enfrente tales problemas, cambie su Objeto JSON a Objeto de matriz JSON.
Por ejemplo,
fuente
El
orderBy
filtro realiza una clasificación estable a partir de Angular 1.4.5. (Consulte la solicitud de extracción de GitHub https://github.com/angular/angular.js/pull/12408 .)Por lo tanto, es suficiente usar un predicado constante y
reverse
establecerlo entrue
:fuente
Encontré algo como esto, pero en lugar de matriz uso objetos.
Aquí está mi solución para los objetos:
Añadir filtro personalizado:
Que luego se puede usar como
Si necesita soporte de navegador antiguo, deberá definir la función de reducción (esto solo está disponible en ECMA-262 mozilla.org )
fuente
Yo mismo me había frustrado con este problema, por lo que modifiqué el filtro creado por @Trevor Senior cuando me encontraba con un problema con mi consola que decía que no podía usar el método inverso. También, quería mantener la integridad del objeto porque esto es lo que Angular está usando originalmente en una directiva ng-repeat. En este caso, utilicé la entrada de estúpido (clave) porque la consola se molestaría diciendo que hay duplicados y en mi caso necesitaba rastrear por $ index.
Filtrar:
HTML:
<div ng-repeat="items in items track by $index | reverse: items">
fuente
Estoy agregando una respuesta que nadie mencionó. Intentaría hacer que el servidor lo haga si tienes uno. El filtrado del lado del cliente puede ser peligroso si el servidor devuelve muchos registros. Porque podría verse obligado a agregar paginación. Si tiene paginación del servidor, entonces el filtro del cliente en orden, estaría en la página actual. Lo que confundiría al usuario final. Entonces, si tiene un servidor, envíe el pedido junto con la llamada y deje que el servidor lo devuelva.
fuente
Consejo útil:
Puede invertir su matriz con vanilla Js: yourarray .reverse ()
Precaución: el reverso es destructivo, por lo que cambiará su matriz, no solo la variable.
fuente
Supongo que usar el método inverso nativo de matriz siempre es una mejor opción que crear un filtro o usarlo
$index
.Plnkr_demo .
fuente