Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在考虑大于和小于的情况下进行排序?_Javascript_Sorting - Fatal编程技术网

Javascript 如何在考虑大于和小于的情况下进行排序?

Javascript 如何在考虑大于和小于的情况下进行排序?,javascript,sorting,Javascript,Sorting,我需要对两个字符串进行排序,并考虑>和100出现在>1000之前) 下面是我的代码,它不使用符号(对表中的所有行进行排序): if($this.hasClass('sort-mixed')){ sort_func=sort_mixed; } $rows.sort(sort_func); 函数排序\u混合(a、b){ var val_a=$(a).children().eq(column_index).text(); var val_b=$(b).children().eq(column_inde

我需要对两个字符串进行排序,并考虑>和<符号。因此,例如,排序可能如下所示

<20
<40
<100
0.1
10
1,000,000.75
>100
>1,000
符号。我还希望排序符合显示的确切顺序(例如,从低到高排序时,>100出现在>1000之前)

下面是我的代码,它不使用符号(对表中的所有行进行排序):

if($this.hasClass('sort-mixed')){
sort_func=sort_mixed;
}
$rows.sort(sort_func);
函数排序\u混合(a、b){
var val_a=$(a).children().eq(column_index).text();
var val_b=$(b).children().eq(column_index).text();
val_a=编号(val_a.toString().replace(/,/g,“”);
val_b=编号(val_b.toString().replace(/,/g,”);
如果(val_a>val_b){
返回1*排序方向;
}
if(val_a
这里不是一个完整的解决方案,但足以让您开始。我们将把数组分成多个部分,对每个部分进行排序,然后将数组重新组合在一起

函数编号{
return+s.replace(/[^0-9.]/g',)
}
var arr=[
'1,000',
'1,000,000.75',
'')和&!s.startsWith('')
.map(s=>s.slice(1))
.地图(toNumber)
.sort((a,b)=>a-b)
.map(n=>'>'+n);

console.log([].concat(lt,eq,gt));
使用单个比较器函数进行排序:

const order = { regular: 1, reverse: -1 };
let sortOrder = order.regular;
let strings = ['0.1', '1,000,000.75', '10', '<100', '<20', '<40', '>1,000', '>100'];

function compare(a, b) {
   function toNum(str) { return +str.replace(/[^0-9.-]/g, ''); }
   function range(str) { return { '<': -1, '>': 1 }[str[0]] || 0; }
   const rangeA = range(a);
   const rangeB = range(b);
   const score = rangeA === rangeB ? toNum(a) - toNum(b) : rangeA - rangeB;
   return score * sortOrder;
   }

strings.sort(compare);
篡改代码:

编辑:
添加了排序器

组合方法

// Sort function maker
// - create a sort fn based on two compare fns
//   {f}= primary
//   {g}= secondary
const sort = (f, g) => (a, b) => f(a,b) || g(a,b)

// Compare function maker
// - create a compare fn based on a weighting fn, {w}
const cmp_asc_of = (w) => (a, b) => w(a) - w(b)
const cmp_desc_of = (w) => (a, b) => w(b) - w(a)

// Weighting function
// - weight a given string, {string}, returns a number
const weight_op = (string) => ..
const weight_num = (string) => ..

// Then, create sort functions
const asc  = sort(cmp_asc_of(weight_op), cmp_asc_of(weight_num))
const desc = sort(cmp_asc_of(weight_op), cmp_desc_of(weight_num))

// Usage
array.sort(asc)
array.sort(desc)
就你的情况而言

..
function sort_mixed(a, b) {
  var val_a = ..
  var val_b = ..
  return isHighToLow ? desc(val_a, val_b) : asc(val_a, val_b)

您有一个输入错误,
filter(s=>!s.startsWith('>')和&!s.startsWith('>')
应该是
filter(s=>!s.startsWith('>')和&!s.startsWith('实际上,
.map(s=>s.slice(1))
,因为您将删除
“”
toNumber
中,我能够自己完成这项工作,谢谢,但我有点希望答案是我发布的排序函数的一部分,这样我们就可以根据表中单击的按钮解释从高到低或从低到高的排序。很抱歉,我对Javascript还不是非常熟练。这是直接插入的(除了我必须将(a)改为(val_a)和(b)改为(val_b),除了,你能解释一下我的排序方向设置吗?@Webdrips我刚刚添加了
reverseSort
选项。如果你想拥有一个单独的反向比较器功能,请查看:Dem P。我可以使用类似的东西使它工作。谢谢!
// Sort function maker
// - create a sort fn based on two compare fns
//   {f}= primary
//   {g}= secondary
const sort = (f, g) => (a, b) => f(a,b) || g(a,b)

// Compare function maker
// - create a compare fn based on a weighting fn, {w}
const cmp_asc_of = (w) => (a, b) => w(a) - w(b)
const cmp_desc_of = (w) => (a, b) => w(b) - w(a)

// Weighting function
// - weight a given string, {string}, returns a number
const weight_op = (string) => ..
const weight_num = (string) => ..

// Then, create sort functions
const asc  = sort(cmp_asc_of(weight_op), cmp_asc_of(weight_num))
const desc = sort(cmp_asc_of(weight_op), cmp_desc_of(weight_num))

// Usage
array.sort(asc)
array.sort(desc)
..
function sort_mixed(a, b) {
  var val_a = ..
  var val_b = ..
  return isHighToLow ? desc(val_a, val_b) : asc(val_a, val_b)