首页 > 解决方案 > 按定义的值排序(如果找到)

问题描述

仅使用本机 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分成两个数组,排序和梳理)并且实现这一目标的合理有效的方法?

标签: javascriptsorting

解决方案


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直接在回调中使用,您可能会找到一种更优雅的方式来合并这些默认值:-)


推荐阅读