在JavaScript中对字符串类型列进行排序

在JavaScript中对字符串类型列进行排序,javascript,Javascript,我想知道如何对具有数字或“x”值(未定义)的列进行排序。对于传统排序,结果不正确,17比7来得早 例如: 17 7 9 X 要将其排序为: 7 9 17 X PS. 我正在使用: var data = new google.visualization.DataTable() data.addRow[{v:'17'}, {v:'7'}, {v:'9'}, {v:'X'}] 我希望能够在事件侦听器中对其进行排序。您可以通过检查'X'进行排序,并将此值

我想知道如何对具有数字或“x”值(未定义)的列进行排序。对于传统排序,结果不正确,17比7来得早

例如:

17   
7    
9    
X
要将其排序为:

7    
9    
17   
X
PS.
我正在使用:

var data = new google.visualization.DataTable()
data.addRow[{v:'17'}, {v:'7'}, {v:'9'}, {v:'X'}]

我希望能够在事件侦听器中对其进行排序。

您可以通过检查
'X'
进行排序,并将此值移动到数组的末尾

通过不带回调的获取,所有项都被排序为字符串

分拣分两部分进行

  • 检查
    NaN
    并获取布尔结果的增量,这意味着

     value   value  isNaN  isNaN
       a       b      a      b    delta  meaning
    ------  ------  -----  -----  -----  -------
      NaN     NaN    true   true    0   a === b
      NaN   number   true  false    1   a  >  b
    number    NaN   false   true   -1   a  <  b
    number  number  false  false    0   a === b
    

    您可以通过检查
    'X'
    进行排序,并将此值移动到数组的末尾

    通过不带回调的获取,所有项都被排序为字符串

    分拣分两部分进行

  • 检查
    NaN
    并获取布尔结果的增量,这意味着

     value   value  isNaN  isNaN
       a       b      a      b    delta  meaning
    ------  ------  -----  -----  -----  -------
      NaN     NaN    true   true    0   a === b
      NaN   number   true  false    1   a  >  b
    number    NaN   false   true   -1   a  <  b
    number  number  false  false    0   a === b
    

    您可以将
    localeCompare
    与比较器函数中的
    {numeric:true}
    选项一起使用:

    让arr=[“17”、“7”、“9”、“X”];
    函数比较器(a,b){
    返回a.localeCompare(b,“en”,{numeric:true});
    }
    console.log(
    arr.sort(比较器)
    
    )
    您可以在比较器函数中使用
    localeCompare
    {numeric:true}
    选项:

    让arr=[“17”、“7”、“9”、“X”];
    函数比较器(a,b){
    返回a.localeCompare(b,“en”,{numeric:true});
    }
    console.log(
    arr.sort(比较器)
    )
    你想要的

    您可以在排序函数()中使用它:

    你想要的

    您可以在排序函数()中使用它:



    尝试选择排序并放置一个条件,将X设置为最高值。您可以将比较器函数传递给Array.sort()以满足您的需要。可能重复尝试选择排序并放置条件以将X设置为最高值。您可以将比较器函数传递给Array.sort()以满足您的需要。在我看来,OP可能使用字符串值,因此您可能需要将示例更改为BitThank@Nina。实际上,它就像一个事件监听器,当在html中选择列时,总是需要对其进行排序。您能再解释一下比较器吗?很难理解,在我看来,OP可能使用字符串值,所以您可能需要将示例更改为BitThank@Nina。实际上,它就像一个事件监听器,当在html中选择列时,总是需要对其进行排序。您能再解释一下比较器吗?对像
    {v:7}
    这样的对象进行排序,用
    比较器({v:a},{v:b})
    替换
    比较器(a,b)
    是很难理解的,谢谢。这是清楚的。您能解释一下我如何在事件侦听器中使用它吗?目前,我正在使用以下堆栈溢出帖子的答案进行偶数排序:只要您有一个包含数组的变量,就可以将该函数插入其中。@Luca,我尝试过,但仍然无法使其工作,因为我需要在代码中添加一些“event”。我正在使用的原始文件是:data.sort([{column:event.column,desc:!event.ascending}]);。如何更改代码,使a和b引用偶数.column的条目?要对像
    {v:7}
    这样的对象进行排序,请将
    比较器(a,b)
    替换为
    比较器({v:a},{v:b})
    @Luca,谢谢。这是清楚的。您能解释一下我如何在事件侦听器中使用它吗?目前,我正在使用以下堆栈溢出帖子的答案进行偶数排序:只要您有一个包含数组的变量,就可以将该函数插入其中。@Luca,我尝试过,但仍然无法使其工作,因为我需要在代码中添加一些“event”。我正在使用的原始文件是:data.sort([{column:event.column,desc:!event.ascending}]);。如何更改代码,使a和b引用偶数列的条目?
    ["17", "7", "9", "X"].sort(function(a,b) {
      return a.localeCompare(b, undefined, {numeric: true})
    })
    // ["7", "9", "17", "X"]