当缺少某些项目时,根据单独数组的顺序对一个数组进行排序?

Sort one array based on the order of a separate array, when some items are missing?

我有一个数组存储首选顺序,还有一个更大的数组需要排序:

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 在列表中,您将得到 (-1) - positive = negative,因此 a 应该排在 b 之后。

如何使用首选订单列表将未列出的商品放在最后?

您可以添加一个用于为未知值获取虚假值并取一个较大的值而不是将此项目移动到已知项目的末尾。

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);

我会这样做...

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 ))