¿Hay alguna forma en jQuery o javascript para ordenar los datos por categoría en orden descendente y el nombre en orden ascendente?
Intenté ordenar los datos dos veces de manera similar al código de muestra a continuación, pero no funciona como debería.
Los datos deben enumerarse por categoría como B, A y luego se ordenarán por nombre como AA, AB, BB, etc.
Muestra de datos y secuencia de comandos:
var data = { 0: { category: 'A', name: 'AA' }, 1: { category: 'B', name: 'BB' }, 2: { category: 'A', name: 'AB' }, 3: { category: 'A', name: 'BB' } } var items = $( $.map( data, function ( val, i ) { return val; } ) ); // Sort data by category in DESC order. function sortByCategoryDescOrder( a, b ) { if ( a.category < b.category ) { return -1; } if ( a.category > b.category ) { return 1; } return 0; } function sortByNameAscOrder( a, b ) { if ( a.name < b.name ) { return -1; } if ( a.name > b.name ) { return 1; } return 0; } items.sort(sortByCategoryDescOrder); items.sort(sortByNameAscOrder); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js"></script>El resultado esperado debe ser:
var data = { 0: { category: 'B', name: 'BB' }, 1: { category: 'A', name: 'AA' }, 2: { category: 'A', name: 'AB' }, 3: { category: 'A', name: 'BB' } }Esta es mi solución:
let data = { 0: { category: 'A', name: 'AA' }, 1: { category: 'B', name: 'BB' }, 2: { category: 'A', name: 'AB' }, 3: { category: 'A', name: 'BB' } } let result=Object.values(data).sort((a,b)=>{ if (a.category>b.category){ return -1; } else { if (a.category<b.category){ return 1; } else { if (a.name > b.name) { return 1 } else { if (a.name < b.name) { return -1 } } } } }); console.log(result);Dos problemas.
sortByCategoryDescOrder son incorrectos. La ordenación en orden descendente debe devolver +1 cuando a < b , -1 cuando a > b y 0 en a === b .sortByNameAscOrder , no debe comparar objetos con diferentes category . Ya ha ordenado la matriz según la category , si vuelve a ordenar la matriz comparando diferentes valores de category , obtendrá el formato de la matriz original. Debe devolver 0 para diferentes valores de category , lo que significa que no está cambiando el orden en ese caso.violín de trabajo
var data = { 0: { category: 'A', name: 'AA' }, 1: { category: 'B', name: 'BB' }, 2: { category: 'A', name: 'AB' }, 3: { category: 'A', name: 'BB' } } var items = $($.map(data, function (val, i) { return val; })); // Sort data by category in DESC order. function sortByCategoryDescOrder(a, b) { if (a.category < b.category) { return 1; } if (a.category > b.category) { return -1; } return 0; } function sortByNameAscOrder(a, b) { if(a.category !== b.category) { return 0; } if (a.name < b.name) { return -1; } if (a.name > b.name) { return 1; } return 0; } console.log(items.sort(sortByCategoryDescOrder)); console.log(items.sort(sortByNameAscOrder)); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js"></script>