我有一个小的排序算法,它按多个字段对数组进行排序:
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;
});我想在这个排序算法中添加一个额外的可选参数,它将保持顺序,但首先放置具有特殊字段的项。例如,以下列表:
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,
}
}
}应按以下顺序排列
['3', '4', '2', '1']我尝试在公式中添加一个额外的函数和一个数字,但这并不影响顺序:
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))
发布于 2022-05-03 21:06:47
您的代码可以大规模简化为以下内容:
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));
发布于 2022-05-03 21:20:18
你想像这样做分类:
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))主要的变化是,基本上您只需要先检查具有优先级的属性,然后在两个项之间的优先级相同时检查其他属性。
https://stackoverflow.com/questions/72105183
复制相似问题