javascript - 按定义的值排序(如果找到)
问题描述
仅使用本机 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
直接在回调中使用,您可能会找到一种更优雅的方式来合并这些默认值:-)
推荐阅读
- python - 删除具有毫秒不同采样频率的连续重复 - Python
- java - 出错时再次调用并在 webflux 中重试
- java - 如何分配 jwt 令牌以在 java spring 上生成身份验证
- winapi - 如何丢弃即将到来的消息?
- android - Android Studio,布局,圆角,不同的背景颜色
- python - 滚动条无法在 tkinter 中正确构建
- android - 约束布局内的线性布局中的图像视图之间的间隙
- jquery - 无法以 Mura 形式为目标
- python - 拆分包含多个串联在一起的 XML 文档的大型 XML 文件
- angular - 如何将对象数组分配给 FormGroup 中的控件