我有一个存储首选顺序的数组,以及一个需要排序的更大数组:
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))
gives (-1) - (-1) = 0)
)而不是他们在最后,他们最终在开始......即使如果你a
不在首选顺序列表中,并且b
在列表中,你会得到(-1) - positive = negative
so 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)