按表示节号的字符串排序的下划线

underscore sort by string that represent section number

本文关键字:字符串 下划线 排序 表示      更新时间:2023-09-26
[
 {name:"foo", value:"1", order:"1.1.12"},
 {name:"foo bar", value:"2", order:"2.10.1"},
 {name:"bar", value:"3", order:"1.11.5"},
 {name:"baz", value:"4", order:"2.6.2"},
 {name:"foo baz", value:"5", order:"1.3.10"}
]

如何在下划线的帮助下按order.js(或没有)对这个列表进行排序。所以我最终会得到这个:

[
 {name:"a", value:"1", order:"1.1.12"},
 {name:"a", value:"5", order:"1.3.10"},
 {name:"a", value:"3", order:"1.11.5"},
 {name:"a", value:"4", order:"2.6.2"},
 {name:"a", value:"2", order:"2.10.1"}  
]

值得一提的是,order可以是任何长度的数字,例如它可以是:

1.1
2
3.1.2.3 

因此,解决方案必须是通用的。

您可以将字符串拆分为数字数组,并比较同一位置的数字,直到找到不同的东西:

var arr = [
 {name:"foo", value:"1", order:"1.1.12"},
 {name:"foo bar", value:"2", order:"2.10.1"},
 {name:"bar", value:"3", order:"1.11.5"},
 {name:"baz", value:"4", order:"2.6.2"},
 {name:"foo baz", value:"5", order:"1.3.10"},  
 {name:"foo baz", value:"5", order:"1.3"},   
 {name:"foo baz", value:"5", order:"2"}
];

arr.sort(function(item1, item2){
  var split1 = item1.order.split('.');
  var split2 = item2.order.split('.');
  var length = Math.min(split1.length, split2.length);
  for (var i=0; i<length; i++){
    if (+split1[i] < +split2[i])
      return -1;
    if (+split1[i] > +split2[i])
      return 1;
  }
  return split1.length - split2.length;
});
console.log(arr);

PS:纯JS解决方案,不使用下划线。

看看这个: 如何使用js比较软件版本号?(仅数字)

您当然必须将订单变量拆分为 "."

_.map([...],function(item) { item = item.split('.'); return item;});

此时,您有一个新问题,它只是按多个值排序。我想您可能会按每个订单数组的第 0 个值分组,然后按下一个值排序。

最终你可能会得到一个递归的解决方案......我会开始考虑在这里编辑一个。