如何在javascript中定义自定义排序功能?

Posted

技术标签:

【中文标题】如何在javascript中定义自定义排序功能?【英文标题】:How to define custom sort function in javascript? 【发布时间】:2011-06-27 12:48:53 【问题描述】:

我使用 atocomplete.jquery 插件来建议输入文本,结果我得到了这个数组:

['White 023','White','White flower', 'Teatr']

当我开始搜索从 te 子字符串开始的内容时,它会显示这样的数组排序:

'White','White 023','White flower', 'Teatr'

我需要这样的东西:

 'Teatr','White','White 023','White flower'

有什么想法吗?

【问题讨论】:

您可以在此处找到有关该主题的一些有用答案:Sorting objects in an array by a field value in javascript 【参考方案1】:

Objects 试试这个:

function sortBy(field) 
  return function(a, b) 
    if (a[field] > b[field]) 
      return -1;
     else if (a[field] < b[field]) 
      return 1;
    
    return 0;
  ;

【讨论】:

颠倒顺序。【参考方案2】:

或更短

function sortBy(field) 
  return function(a, b) 
    return (a[field] > b[field]) - (a[field] < b[field])
  ;


let myArray = [
    tabid: 6237, url: 'https://reddit.com/r/znation',
    tabid: 8430, url: 'https://reddit.com/r/soccer',
    tabid: 1400, url: 'https://reddit.com/r/askreddit',
    tabid: 3620, url: 'https://reddit.com/r/tacobell',
    tabid: 5753, url: 'https://reddit.com/r/reddevils',
]

myArray.sort(sortBy('url'));
console.log(myArray);

【讨论】:

return function(a,b) return (a[field] &gt; b[field]) - (a[field] &lt; b[field]); 是我猜你的意思。聪明的。使用示例可以解决这个问题,例如my_array.sort(sortBy('my_field')); 我喜欢算术运算。看起来比显式检查/返回更整洁。【参考方案3】:

可能是插件区分大小写。尝试输入Te 而不是te。您可能可以将结果设置为不区分大小写。这个question 可能会有所帮助。

对于Array 上的自定义排序函数,您可以使用任何JavaScript 函数并将其作为参数传递给Arraysort() 方法,如下所示:

var array = ['White 023', 'White', 'White flower', 'Teatr'];

array.sort(function(x, y) 
  if (x < y) 
    return -1;
  
  if (x > y) 
    return 1;
  
  return 0;
);

// Teatr White White 023 White flower
document.write(array);

More Info here on Array.sort.

【讨论】:

自定义 sort() 调用很有用,但此示例具有误导性。比较函数不应返回布尔值,而应返回有符号整数,其中负返回值表示 x y,0 表示 x = 0。例如,如果 x 和 y 是整数,则很容易编写这样的函数 function(x, y) return x - y; 你是对的,泰勒!当我看到接受的解决方案时,我想评论更正,但你先做了。 @Tyler 我认为您的意思是返回值 0 表示 x=y,而不是 x=0。 @abw333 是的!那是一个错字。太糟糕了,我不能再编辑那条评论了。 啊!我只花了 10 分钟试图弄清楚为什么我的排序不起作用。我们可以改正这个错字吗?它必须在谷歌上排名很高才能让我找到它。【参考方案4】:
function msort(arr)
    for(var i =0;i<arr.length;i++)
        for(var j= i+1;j<arr.length;j++)
            if(arr[i]>arr[j])
                var swap = arr[i];
                arr[i] = arr[j];
                arr[j] = swap;
            
        
    
return arr;

【讨论】:

javascript 中的默认排序将比冒泡排序快得多。 OP 要求自定义比较器,而不是 js 中排序的自定义实现。

以上是关于如何在javascript中定义自定义排序功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何按自定义顺序对 JavaScript 中的数组进行排序? [复制]

Sequelize如何添加自定义排序功能?

如何自定义这个已经自定义的 jQuery 排序解决方案?

如何在 prestashop 中添加自定义产品“排序依据”字段?

asp.net 如何方便,快速的实现,好像excel那样的自定义排序与自定义筛选功能。

SQL Server的自定义排序功能