Tengo un pequeño algoritmo de clasificación que ordena una matriz por varios campos:
const termKeys = Object.keys(proposal.terms); const sorted = termKeys.sort((a, b) => { if (proposal.terms[a].unified_price === proposal.terms[b].unified_price) { return gates[b].productivity - gates[a].productivity; } return proposal.terms[a].unified_price - proposal.terms[b].unified_price; });Quiero agregar un parámetro opcional adicional a este algoritmo de clasificación que mantendría el orden pero colocaría primero los elementos que tienen un campo especial. Por ejemplo, la siguiente lista:
const proposal = { terms: { '1': { unified_price: 123, productivity: 10, has_baggage: false, }, '2': { unified_price: 111, productivity: 10, has_baggage: false, }, '3': { unified_price: 456, productivity: 10, has_baggage: true, }, '4': { unified_price: 678, productivity: 10, has_baggage: true, } } }debe estar en el siguiente orden
['3', '4', '2', '1']Intenté agregar una función adicional y un número a la fórmula, pero eso no afectó el orden:
const hasBaggage = true; const proposal = { terms: { '1': { unified_price: 123, productivity: 10, has_baggage: false, }, '2': { unified_price: 111, productivity: 10, has_baggage: false, }, '3': { unified_price: 456, productivity: 10, has_baggage: true, }, '4': { unified_price: 678, productivity: 10, has_baggage: true, } } } function decidePositionOfBaggage(a, b) { if (a === b) { return 0; } if (b === false && a === true) { return -1; } if (b === true && a === false) { return 1; } } function sortProposal(proposal) { const termKeys = Object.keys(proposal.terms); const sorted = termKeys.sort((a, b) => { const hasBaggageNumber = decidePositionOfBaggage(proposal.terms[a].has_baggage, proposal.terms[b].has_baggage); if (proposal.terms[a].unified_price === proposal.terms[b].unified_price) { return (gates[b].productivity - gates[a].productivity) - hasBaggageNumber; } return (proposal.terms[a].unified_price - proposal.terms[b].unified_price) - hasBaggageNumber; }); return sorted; } console.log(sortProposal(proposal))Su código se puede simplificar enormemente a esto:
const proposal = { terms: { 1: { unified_price: 123, productivity: 10, has_baggage: false, }, 2: { unified_price: 111, productivity: 10, has_baggage: false, }, 3: { unified_price: 456, productivity: 10, has_baggage: true, }, 4: { unified_price: 678, productivity: 10, has_baggage: true, }, }, }; const sort = ({ terms }) => { return Object.entries(terms).sort(([_, a], [__, b]) => { if (a.has_baggage && !b.has_baggage) return -1; if (!a.has_baggage && b.has_baggage) return 1; return a.unified_price - b.unified_price; }); }; console.log(sort(proposal));Desea hacer la clasificación de esta manera:
const hasBaggage = true const proposal = { terms: { '1': { unified_price: 123, productivity: 10, has_baggage: false, }, '2': { unified_price: 111, productivity: 10, has_baggage: false, }, '3': { unified_price: 456, productivity: 10, has_baggage: true, }, '4': { unified_price: 678, productivity: 10, has_baggage: true, } } } function decidePositionOfBaggage(a, b) { if (a === b) { return 0; } if (b === false && a === true) { return -1; } if (b === true && a === false) { return 1; } } function sortProposal(proposal) { const termKeys = Object.keys(proposal.terms); const sorted = termKeys.sort((a, b) => { const hasBaggageNumber = decidePositionOfBaggage(proposal.terms[a].has_baggage, proposal.terms[b].has_baggage); if (hasBaggageNumber !== 0) { return hasBaggageNumber } if (proposal.terms[a].unified_price === proposal.terms[b].unified_price) { return (gates[b].productivity - gates[a].productivity); } return (proposal.terms[a].unified_price - proposal.terms[b].unified_price); }); return sorted; } console.log(sortProposal(proposal))El cambio principal es que, básicamente, solo necesita verificar primero la propiedad que tiene prioridad y verificar las demás solo cuando la prioridad es la misma entre ambos elementos.