Tengo una matriz de objetos en los que cada objeto tiene los siguientes atributos:

  • número de identificación)
  • IsBlue (OPCIONAL verdadera o falsa)
  • IsRed (OPCIONAL verdadera o falsa)
  • clasificación (número OPCIONAL - 1 es más prioridad que 2 -)
  • createdAt (fecha en formato de cadena '2012-02-01')

Quiero poder ordenar los objetos en estas matrices para que primero aparezcan los azules, luego los rojos y, por último, los que no sean azules o rojos. Luego, dentro de cada 'categoría' por color, quiero ordenar por clasificación y luego por creado en ascendente (los más antiguos aparecen primero).

Entonces, quiero el azul primero, el rojo segundo, los otros colores al final. Pero luego para cada color que quiero ordenar rastrillando y creado en.

Ejemplo de entrada:

[ 
{ id: 5, isBlue: false, isRed: true, ranking: 3, createdAt:
'2010-01-20' }, 
{ id: 3, isBlue: false, isRed: true, ranking: 3,
createdAt: '2010-01-23' }, 
{ id: 2, isBlue: false, isRed: true,
ranking: 2, createdAt: '2012-01-23' }, 
{ id: 16, isBlue: false, isRed:
false, ranking: 1, createdAt: '2014-01-23' }, 
{ id: 1, isBlue: true,
isRed: false, ranking: null, createdAt: '2014-01-23' },  
{ id: 10,isBlue: true, isRed: false, ranking: 3, createdAt: '2012-01-23'}
 ]

El resultado esperado sería:

[
 { id: 10,isBlue: true, isRed: false, ranking: 3, createdAt: '2012-01-23'},
 { id: 1, isBlue: true,
isRed: false, ranking: null, createdAt: '2014-01-23' },
{ id: 2, isBlue: false, isRed: true,
ranking: 2, createdAt: '2012-01-23' },
{ id: 5, isBlue: false, isRed: true, ranking: 3, createdAt:
'2010-01-20' },
{ id: 3, isBlue: false, isRed: true, ranking: 3,
createdAt: '2010-01-23' }, 
{ id: 16, isBlue: false, isRed:
false, ranking: 1, createdAt: '2014-01-23' }, 
]

No sé cómo hacer este orden 'por color primero' y luego por rastrillado y creado dentro de cada grupo de colores.

0
Hommer Smith 10 sep. 2018 a las 14:54

3 respuestas

La mejor respuesta
const rows = [ 
{ id: 5, isBlue: false, isRed: true, ranking: 3, createdAt:
'2010-01-20' }, 
{ id: 3, isBlue: false, isRed: true, ranking: 3,
createdAt: '2010-01-23' }, 
{ id: 2, isBlue: false, isRed: true,
ranking: 2, createdAt: '2012-01-23' }, 
{ id: 16, isBlue: false, isRed:
false, ranking: 1, createdAt: '2014-01-23' }, 
{ id: 1, isBlue: true,
isRed: false, ranking: undefined, createdAt: '2014-01-23' },  
{ id: 10,isBlue: true, isRed: false, ranking: 3, createdAt: '2012-01-23'}
 ];
 
 const sorted = rows.sort((a, b) => {
   if( a.isBlue === b.isBlue ) {
     if( a.isRed === b.isRed ) {
       if( a.ranking === b.ranking ) {
         return new Date(a.createdAt) < new Date(b.createdAt) ? -1 : 1;
       }
       return a.ranking < b.ranking ? -1 : 1;
     }
     return b.isRed < a.isRed ? -1 : 1;
   }
   return b.isBlue < a.isBlue ? -1 : 1;
 })
 
 console.log(sorted);
 
 document.write(`ids: ${sorted.map(i => i.id)}`);
0
Teneff 10 sep. 2018 a las 12:39

Usted encadena los tipos de menos relevantes a más relevantes como:

var arr = [{ id: 5, isBlue: false, isRed: true, ranking: 3, createdAt:'2010-01-20' }, 
{ id: 3, isBlue: false, isRed: true, ranking: 3, createdAt: '2010-01-23' }, 
{ id: 2, isBlue: false, isRed: true, ranking: 2, createdAt: '2012-01-23' }, 
{ id: 16, isBlue: false, isRed:false, ranking: 1, createdAt: '2014-01-23' }, 
{ id: 1, isBlue: true, isRed: false, ranking: null, createdAt: '2014-01-23' },  
{ id: 10,isBlue: true, isRed: false, ranking: 3, createdAt: '2012-01-23'} ];


    arr.sort((a,b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())
    .sort((a,b) => (b.ranking || 0) - (a.ranking || 0))
    .sort((a,b) => (a.isRed === b.isRed) ? 0 : a.isRed ? -1 : 1)
    .sort((a,b) => (a.isBlue === b.isBlue) ? 0 : a.isBlue ? -1 : 1);
    
    console.log(arr)
1
Vladimir Boretskyi 10 sep. 2018 a las 16:43

Puede usar la sintaxis es6 en reemplazo de es5, que será una buena opción.

var data = [{
        id: 5,
        isBlue: false,
        isRed: true,
        ranking: 3,
        createdAt: '2010-01-20'
    },
    {
        id: 3,
        isBlue: false,
        isRed: true,
        ranking: 3,
        createdAt: '2010-01-23'
    },
    {
        id: 2,
        isBlue: false,
        isRed: true,
        ranking: 2,
        createdAt: '2012-01-23'
    },
    {
        id: 16,
        isBlue: false,
        isRed: false,
        ranking: 1,
        createdAt: '2014-01-23'
    },
    {
        id: 1,
        isBlue: true,
        isRed: false,
        ranking: null,
        createdAt: '2014-01-23'
    },
    {
        id: 10,
        isBlue: true,
        isRed: false,
        ranking: 3,
        createdAt: '2012-01-23'
    }
];

var obj = {
    isBlue: [],
    isRed: [],
    isNone: []
};
data.forEach(function(val, i) {
    var key = val.isBlue ? "isBlue" : val.isRed ? "isRed" : "isNone";
    obj[key].push(val);
});

function sortValue(a, b) {
    return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();
}
obj.isBlue = obj.isBlue.sort(sortValue);
obj.isRed = obj.isRed.sort(sortValue);
obj.isNone = obj.isNone.sort(sortValue);
var result = [].concat(obj.isBlue).concat(obj.isRed).concat(obj.isNone);

console.log(result);
0
Nishant Dixit 10 sep. 2018 a las 12:06