Tengo una matriz que almacena un orden preferido y una matriz más grande que necesito ordenar:
const months = ['March', 'Jan', 'Feb', 'Dec']; const prefOrder = ['Feb', 'March'] months.sort((a, b) => (prefOrder.indexOf(a) - prefOrder.indexOf(b))); // desired output: ['Feb', 'March', 'Dec', 'Jan'] // or: ['Feb', 'March', 'Jan', 'Dec' ] console.log(months); Sin embargo, cuando dos elementos que se comparan no están en la lista (es decir (prefOrder.indexOf(a) - prefOrder.indexOf(b)) da (-1) - (-1) = 0) ) en lugar de estar al final , terminan al principio... aunque si no está a la lista de orden preferido y b está en la lista, obtendrá (-1) - positive = negative , por lo que a debe ordenarse después de b .
¿Cómo puedo usar la lista de pedidos preferidos para poner el artículo no listado al final?
Puede agregar uno para obtener un valor falso para valores desconocidos y tomar un valor grande en su lugar para mover estos elementos al final de los elementos conocidos.
const months = ['March', 'Jan', 'Feb', 'Dec'], prefOrder = ['Feb', 'March']; months.sort((a, b) => (prefOrder.indexOf(a) + 1 || Number.MAX_VALUE) - (prefOrder.indexOf(b) + 1 || Number.MAX_VALUE) ); console.log(months);En lugar de usar una matriz, tome un objeto con el orden deseado y mueva los elementos desconocidos al final con un valor predeterminado grande.
const months = ['March', 'Jan', 'Feb', 'Dec'], order = { Feb: 1, March: 2 }; months.sort((a, b) => (order[a] || Number.MAX_VALUE) - (order[b] || Number.MAX_VALUE) ); console.log(months);lo hare de esta manera...
const months = ['March', 'Jan', 'Feb', 'Dec'] , prefOrder = ['Feb', 'March'] ; months.sort((a, b) => { if (!prefOrder.includes(a)) return +1 if (!prefOrder.includes(b)) return -1 return (prefOrder.indexOf(a) - prefOrder.indexOf(b)) }) console.log( JSON.stringify( months ))