如何解决按定义的值排序如果找到
仅使用本机ES2015(即没有库) 我需要按照一组定义的值(请考虑T恤衫的尺寸)对对象列表进行排序,并对与其中一个定义值匹配的对象进行优先排序。
样本数据:
const shirt_stock= [
{size: "M"},{size: "L"},{size: "M"},{size: "XM"},{size: "XL"} ]
定义的排序顺序:
const sort_order = ["S","M","L","XL"]
排序代码(排序使用indexOf()时无需注释,它是伪代码):
shirt_stock.sort((a,b) => {
return sort_order.indexOf(b.size) - sort_order.indexOf(a.size)
})
产量结果:
> 0: "XM"
> 1: "M"
> 2: "M"
> 3: "L"
> 4: "XL"
问题在于,第一个结果为“ XM”-我希望最后一个结果。换句话说,我想先按sort_order
中定义的顺序对已知大小的衬衫进行排序,然后对其他所有内容进行排序-如果“未知大小的衬衫”也进行了排序,则按其大小进行分组
所需结果:
> 0: "M"
> 1: "M"
> 2: "L"
> 3: "XL"
> 4: "XM"
我很困惑,什么是干净的方法(例如,不将shirt_stock
分成两个数组,不进行排序和梳理)和合理有效的方法来实现这一目标?
解决方法
indexOf
对于找不到的元素返回-1
,然后将其放在第一位。您将需要使用比这些元素的所有其他索引更高的值。这是实现此目的的快速方法:
shirt_stock.sort((a,b) => {
return (sort_order.indexOf(a.size)+1 || sort_order.length+1) - (sort_order.indexOf(b.size)+1 || sort_order.length+1)
})
由于您已经计划不直接在回调中使用indexOf
,因此您可能还会发现一种更优雅的方式来合并这些默认值:-)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。