我有一個存盤首選順序的陣列,以及一個需要排序的更大陣列:
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);
但是,當要比較的兩個專案不在串列中(即(prefOrder.indexOf(a) - prefOrder.indexOf(b))給出(-1) - (-1) = 0))而不是它們在末尾時,它們會在開始時結束......即使您a不在首選順序串列中,并且b在串列中,您'd get (-1) - positive = negativesoa應該排在后面b。
如何使用首選訂單串列將未列出的專案放在最后?
uj5u.com熱心網友回復:
您可以添加一個以獲得未知值的虛假值,并取一個較大的值來將此專案移動到已知專案的末尾。
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);
不要使用陣列,而是使用具有所需順序的物件并將未知專案移動到具有較大默認值的末尾。
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);
uj5u.com熱心網友回復:
我會這樣做...
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 ))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/454063.html
標籤:javascript 数组 排序
