Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.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 浏览器中大型XML文件的快速自然排序?_Javascript_Jquery_Xml_Xslt - Fatal编程技术网

Javascript 浏览器中大型XML文件的快速自然排序?

Javascript 浏览器中大型XML文件的快速自然排序?,javascript,jquery,xml,xslt,Javascript,Jquery,Xml,Xslt,我现在遇到了一个问题,这是由于我们的团队无法控制的服务器受到当前限制的结果 我们有一个应该由数据库完成的工作,但我们不得不使用XML文件并使用Javascript/jQuery解析它。我们甚至没有脚本的写入权限(仅通过FTP帐户)。。。我们不想谈论它,但这就是我们得到的 由于这些限制,问题在于我们需要解析一个大约500kb的大型XML文件,其中包含1700条文档名/编号/url的ish记录 这个数字相当复杂,比如“31-2b-1029E”,混合了“T2315342”之类的东西 所以,我想我需要使

我现在遇到了一个问题,这是由于我们的团队无法控制的服务器受到当前限制的结果

我们有一个应该由数据库完成的工作,但我们不得不使用XML文件并使用Javascript/jQuery解析它。我们甚至没有脚本的写入权限(仅通过FTP帐户)。。。我们不想谈论它,但这就是我们得到的

由于这些限制,问题在于我们需要解析一个大约500kb的大型XML文件,其中包含1700条文档名/编号/url的ish记录

这个数字相当复杂,比如“31-2b-1029E”,混合了“T2315342”之类的东西

所以,我想我需要使用一种叫做“自然排序”(谢谢stackoverflow)的方法

无论如何,我尝试在这里使用此脚本:

/*
 * Reference: http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm/
 * Natural Sort algorithm for Javascript - Version 0.6 - Released under MIT license
 * Author: Jim Palmer (based on chunking idea from Dave Koelle)
 * Contributors: Mike Grier (mgrier.com), Clint Priest, Kyle Adams, guillermo
 */
function naturalSort (a, b) {
    var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
        sre = /(^[ ]*|[ ]*$)/g,
        dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
        hre = /^0x[0-9a-f]+$/i,
        ore = /^0/,
        // convert all to strings and trim()
        x = a.toString().replace(sre, '') || '',
        y = b.toString().replace(sre, '') || '',
        // chunk/tokenize
        xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
        yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
        // numeric, hex or date detection
        xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)),
        yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null;
    // first try and sort Hex codes or Dates
    if (yD)
        if ( xD < yD ) return -1;
        else if ( xD > yD ) return 1;
    // natural sorting through split numeric strings and default strings
    for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
        // find floats not starting with '0', string or 0 if not defined (Clint Priest)
        oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
        oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
        // handle numeric vs string comparison - number < string - (Kyle Adams)
        if (isNaN(oFxNcL) !== isNaN(oFyNcL)) return (isNaN(oFxNcL)) ? 1 : -1; 
        // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
        else if (typeof oFxNcL !== typeof oFyNcL) {
            oFxNcL += ''; 
            oFyNcL += ''; 
        }
        if (oFxNcL < oFyNcL) return -1;
        if (oFxNcL > oFyNcL) return 1;
    }
    return 0;
}
这在我们的另一个较小的XML文件上运行良好,但对于500kb的大型ish文件Safari(v4)来说,它只是简单地挂起几分钟来进行排序,而Firefox(最新版本)大约需要10秒来处理(仍然不好,但至少正常)

我还发现了另一个更小/更轻的脚本,名为Alphanum

function alphanum(a, b) {
  function chunkify(t) {
    var tz = [], x = 0, y = -1, n = 0, i, j;

    while (i = (j = t.charAt(x++)).charCodeAt(0)) {
      var m = (i == 46 || (i >=48 && i <= 57));
      if (m !== n) {
        tz[++y] = "";
        n = m;
      }
      tz[y] += j;
    }
    return tz;
  }

  var aa = chunkify(a);
  var bb = chunkify(b);

  for (x = 0; aa[x] && bb[x]; x++) {
    if (aa[x] !== bb[x]) {
      var c = Number(aa[x]), d = Number(bb[x]);
      if (c == aa[x] && d == bb[x]) {
        return c - d;
      } else return (aa[x] > bb[x]) ? 1 : -1;
    }
  }
  return aa.length - bb.length;
}
<t>
 <str>Allegia 6R Clasteron</str>
 <str>200X Radonius</str>
 <str>Xiph Xlater 10000</str>
 <str>1000X Radonius Maximus</str>
 <str>Callisto Morphamax 6000 SE</str>
 <str>10X Radonius</str>
 <str>20X Radonius</str>
 <str>30X Radonius</str>
 <str>20X Radonius Prime</str>
 <str>40X Radonius</str>
 <str>Allegia 50 Clasteron</str>
 <str>Allegia 500 Clasteron</str>
 <str>Allegia 50B Clasteron</str>
 <str>Allegia 51 Clasteron</str>
 <str>Alpha 100</str>
 <str>Alpha 2</str>
 <str>Alpha 200</str>
 <str>Alpha 2A</str>
 <str>Alpha 2A-8000</str>
 <str>Alpha 2A-900</str>
 <str>Callisto Morphamax</str>
 <str>Callisto Morphamax 500</str>
 <str>Callisto Morphamax 5000</str>
 <str>Callisto Morphamax 600</str>
 <str>Callisto Morphamax 6000 SE2</str>
 <str>Callisto Morphamax 700</str>
 <str>Callisto Morphamax 7000</str>
 <str>Xiph Xlater 2000</str>
 <str>Xiph Xlater 300</str>
 <str>Xiph Xlater 40</str>
 <str>Xiph Xlater 5</str>
 <str>Xiph Xlater 50</str>
 <str>Xiph Xlater 500</str>
 <str>Xiph Xlater 5000</str>
 <str>Xiph Xlater 58</str>
</t>
<t>
   <str>10X Radonius</str>
   <str>20X Radonius</str>
   <str>20X Radonius Prime</str>
   <str>30X Radonius</str>
   <str>40X Radonius</str>
   <str>200X Radonius</str>
   <str>1000X Radonius Maximus</str>
   <str>Allegia 6R Clasteron</str>
   <str>Allegia 50 Clasteron</str>
   <str>Allegia 50B Clasteron</str>
   <str>Allegia 51 Clasteron</str>
   <str>Allegia 500 Clasteron</str>
   <str>Alpha 2</str>
   <str>Alpha 2A</str>
   <str>Alpha 2A-900</str>
   <str>Alpha 2A-8000</str>
   <str>Alpha 100</str>
   <str>Alpha 200</str>
   <str>Callisto Morphamax</str>
   <str>Callisto Morphamax 500</str>
   <str>Callisto Morphamax 600</str>
   <str>Callisto Morphamax 700</str>
   <str>Callisto Morphamax 5000</str>
   <str>Callisto Morphamax 6000 SE</str>
   <str>Callisto Morphamax 6000 SE2</str>
   <str>Callisto Morphamax 7000</str>
   <str>Xiph Xlater 5</str>
   <str>Xiph Xlater 40</str>
   <str>Xiph Xlater 50</str>
   <str>Xiph Xlater 58</str>
   <str>Xiph Xlater 300</str>
   <str>Xiph Xlater 500</str>
   <str>Xiph Xlater 2000</str>
   <str>Xiph Xlater 5000</str>
   <str>Xiph Xlater 10000</str>
</t>
函数alphanum(a,b){
功能组块化(t){
var tz=[],x=0,y=-1,n=0,i,j;
而(i=(j=t.charAt(x++).charCodeAt(0)){
var m=(i==46 | |(i>=48&&i bb[x])?1:-1;
}
}
返回aa.length-bb.length;
}
Safari的运行速度更快,但仍会将浏览器锁定一分钟左右

我做了一些研究,似乎有一些人建议使用XSL对XML条目进行排序,这显然要快得多,因为它内置在浏览器中,而不是在JavaScript上运行

显然有几个不同的实现,随着被多次提及,sourceforge页面似乎表明上一次更新发生在2011-06-22

还有其他选择,例如

我的问题是:

  • XSL是解决这个特定问题的最佳排序选项吗
  • 如果是这样,我如何使用XSL进行自然排序?(指向参考资料的url?)
  • 如果两个问题都是肯定的,我应该使用哪个库来实现最佳兼容性和速度
  • 如果XSL不是最佳选择,那么哪一个是
  • 谢谢你看我的问题。

    问得好,+1

    这里有一个XSLT 1.0解决方案(有一个XSLT 2.0解决方案,它更简单、更容易编写,而且可能更高效,但是5种主要浏览器都没有配备XSLT 2.0处理器):

    
    0
    Z
    
    当此转换应用于下面的XML文档时

    function alphanum(a, b) {
      function chunkify(t) {
        var tz = [], x = 0, y = -1, n = 0, i, j;
    
        while (i = (j = t.charAt(x++)).charCodeAt(0)) {
          var m = (i == 46 || (i >=48 && i <= 57));
          if (m !== n) {
            tz[++y] = "";
            n = m;
          }
          tz[y] += j;
        }
        return tz;
      }
    
      var aa = chunkify(a);
      var bb = chunkify(b);
    
      for (x = 0; aa[x] && bb[x]; x++) {
        if (aa[x] !== bb[x]) {
          var c = Number(aa[x]), d = Number(bb[x]);
          if (c == aa[x] && d == bb[x]) {
            return c - d;
          } else return (aa[x] > bb[x]) ? 1 : -1;
        }
      }
      return aa.length - bb.length;
    }
    
    <t>
     <str>Allegia 6R Clasteron</str>
     <str>200X Radonius</str>
     <str>Xiph Xlater 10000</str>
     <str>1000X Radonius Maximus</str>
     <str>Callisto Morphamax 6000 SE</str>
     <str>10X Radonius</str>
     <str>20X Radonius</str>
     <str>30X Radonius</str>
     <str>20X Radonius Prime</str>
     <str>40X Radonius</str>
     <str>Allegia 50 Clasteron</str>
     <str>Allegia 500 Clasteron</str>
     <str>Allegia 50B Clasteron</str>
     <str>Allegia 51 Clasteron</str>
     <str>Alpha 100</str>
     <str>Alpha 2</str>
     <str>Alpha 200</str>
     <str>Alpha 2A</str>
     <str>Alpha 2A-8000</str>
     <str>Alpha 2A-900</str>
     <str>Callisto Morphamax</str>
     <str>Callisto Morphamax 500</str>
     <str>Callisto Morphamax 5000</str>
     <str>Callisto Morphamax 600</str>
     <str>Callisto Morphamax 6000 SE2</str>
     <str>Callisto Morphamax 700</str>
     <str>Callisto Morphamax 7000</str>
     <str>Xiph Xlater 2000</str>
     <str>Xiph Xlater 300</str>
     <str>Xiph Xlater 40</str>
     <str>Xiph Xlater 5</str>
     <str>Xiph Xlater 50</str>
     <str>Xiph Xlater 500</str>
     <str>Xiph Xlater 5000</str>
     <str>Xiph Xlater 58</str>
    </t>
    
    <t>
       <str>10X Radonius</str>
       <str>20X Radonius</str>
       <str>20X Radonius Prime</str>
       <str>30X Radonius</str>
       <str>40X Radonius</str>
       <str>200X Radonius</str>
       <str>1000X Radonius Maximus</str>
       <str>Allegia 6R Clasteron</str>
       <str>Allegia 50 Clasteron</str>
       <str>Allegia 50B Clasteron</str>
       <str>Allegia 51 Clasteron</str>
       <str>Allegia 500 Clasteron</str>
       <str>Alpha 2</str>
       <str>Alpha 2A</str>
       <str>Alpha 2A-900</str>
       <str>Alpha 2A-8000</str>
       <str>Alpha 100</str>
       <str>Alpha 200</str>
       <str>Callisto Morphamax</str>
       <str>Callisto Morphamax 500</str>
       <str>Callisto Morphamax 600</str>
       <str>Callisto Morphamax 700</str>
       <str>Callisto Morphamax 5000</str>
       <str>Callisto Morphamax 6000 SE</str>
       <str>Callisto Morphamax 6000 SE2</str>
       <str>Callisto Morphamax 7000</str>
       <str>Xiph Xlater 5</str>
       <str>Xiph Xlater 40</str>
       <str>Xiph Xlater 50</str>
       <str>Xiph Xlater 58</str>
       <str>Xiph Xlater 300</str>
       <str>Xiph Xlater 500</str>
       <str>Xiph Xlater 2000</str>
       <str>Xiph Xlater 5000</str>
       <str>Xiph Xlater 10000</str>
    </t>
    
    
    阿莱吉亚6R碎屑龙
    200X拉多尼斯
    Xiph Xlater 10000
    1000倍最大雷多尼乌斯
    木卫四莫法马克6000 SE
    10倍拉多尼乌斯
    20倍拉多尼斯
    30倍拉多尼乌斯
    20倍拉多尼乌斯素数
    40倍拉多尼斯
    阿莱吉亚50号
    阿莱吉亚500
    阿莱格里亚50B号
    阿莱格里亚
    阿尔法100
    阿尔法2
    阿尔法200
    阿尔法2A
    阿尔法2A-8000
    阿尔法2A-900
    木卫四
    Callisto Morphamax 500
    木卫四莫法马克5000
    Callisto Morphamax 600
    Callisto Morphamax 6000 SE2
    木卫四莫法马克700
    卡利斯托莫法马克7000
    第十九届2000年
    Xiph Xlater 300
    Xiph Xlater 40
    Xiph Xlater 5
    Xiph Xlater 50
    Xiph Xlater 500
    Xiph Xlater 5000
    Xiph Xlater 58
    
    生成所需的正确“自然排序”结果

    function alphanum(a, b) {
      function chunkify(t) {
        var tz = [], x = 0, y = -1, n = 0, i, j;
    
        while (i = (j = t.charAt(x++)).charCodeAt(0)) {
          var m = (i == 46 || (i >=48 && i <= 57));
          if (m !== n) {
            tz[++y] = "";
            n = m;
          }
          tz[y] += j;
        }
        return tz;
      }
    
      var aa = chunkify(a);
      var bb = chunkify(b);
    
      for (x = 0; aa[x] && bb[x]; x++) {
        if (aa[x] !== bb[x]) {
          var c = Number(aa[x]), d = Number(bb[x]);
          if (c == aa[x] && d == bb[x]) {
            return c - d;
          } else return (aa[x] > bb[x]) ? 1 : -1;
        }
      }
      return aa.length - bb.length;
    }
    
    <t>
     <str>Allegia 6R Clasteron</str>
     <str>200X Radonius</str>
     <str>Xiph Xlater 10000</str>
     <str>1000X Radonius Maximus</str>
     <str>Callisto Morphamax 6000 SE</str>
     <str>10X Radonius</str>
     <str>20X Radonius</str>
     <str>30X Radonius</str>
     <str>20X Radonius Prime</str>
     <str>40X Radonius</str>
     <str>Allegia 50 Clasteron</str>
     <str>Allegia 500 Clasteron</str>
     <str>Allegia 50B Clasteron</str>
     <str>Allegia 51 Clasteron</str>
     <str>Alpha 100</str>
     <str>Alpha 2</str>
     <str>Alpha 200</str>
     <str>Alpha 2A</str>
     <str>Alpha 2A-8000</str>
     <str>Alpha 2A-900</str>
     <str>Callisto Morphamax</str>
     <str>Callisto Morphamax 500</str>
     <str>Callisto Morphamax 5000</str>
     <str>Callisto Morphamax 600</str>
     <str>Callisto Morphamax 6000 SE2</str>
     <str>Callisto Morphamax 700</str>
     <str>Callisto Morphamax 7000</str>
     <str>Xiph Xlater 2000</str>
     <str>Xiph Xlater 300</str>
     <str>Xiph Xlater 40</str>
     <str>Xiph Xlater 5</str>
     <str>Xiph Xlater 50</str>
     <str>Xiph Xlater 500</str>
     <str>Xiph Xlater 5000</str>
     <str>Xiph Xlater 58</str>
    </t>
    
    <t>
       <str>10X Radonius</str>
       <str>20X Radonius</str>
       <str>20X Radonius Prime</str>
       <str>30X Radonius</str>
       <str>40X Radonius</str>
       <str>200X Radonius</str>
       <str>1000X Radonius Maximus</str>
       <str>Allegia 6R Clasteron</str>
       <str>Allegia 50 Clasteron</str>
       <str>Allegia 50B Clasteron</str>
       <str>Allegia 51 Clasteron</str>
       <str>Allegia 500 Clasteron</str>
       <str>Alpha 2</str>
       <str>Alpha 2A</str>
       <str>Alpha 2A-900</str>
       <str>Alpha 2A-8000</str>
       <str>Alpha 100</str>
       <str>Alpha 200</str>
       <str>Callisto Morphamax</str>
       <str>Callisto Morphamax 500</str>
       <str>Callisto Morphamax 600</str>
       <str>Callisto Morphamax 700</str>
       <str>Callisto Morphamax 5000</str>
       <str>Callisto Morphamax 6000 SE</str>
       <str>Callisto Morphamax 6000 SE2</str>
       <str>Callisto Morphamax 7000</str>
       <str>Xiph Xlater 5</str>
       <str>Xiph Xlater 40</str>
       <str>Xiph Xlater 50</str>
       <str>Xiph Xlater 58</str>
       <str>Xiph Xlater 300</str>
       <str>Xiph Xlater 500</str>
       <str>Xiph Xlater 2000</str>
       <str>Xiph Xlater 5000</str>
       <str>Xiph Xlater 10000</str>
    </t>
    
    
    10倍拉多尼乌斯
    20倍拉多尼斯
    20倍拉多尼乌斯素数
    30倍拉多尼乌斯
    40倍拉多尼斯
    200X拉多尼斯
    1000倍最大雷多尼乌斯
    阿莱吉亚6R碎屑龙
    阿莱吉亚50号
    阿莱格里亚50B号
    阿莱格里亚
    阿莱吉亚500
    阿尔法2
    阿尔法2A
    阿尔法2A-900
    阿尔法2A-8000
    阿尔法100
    阿尔法200
    木卫四
    Callisto Morphamax 500
    Callisto Morphamax 600
    木卫四莫法马克700
    木卫四莫法马克5000
    木卫四莫法马克6000 SE
    Callisto Morphamax 6000 SE2
    卡利斯托莫法马克7000
    Xiph Xlater 5
    Xiph Xlater 40
    Xiph Xlater 50
    Xiph Xlater 58
    Xiph Xlater 300
    Xiph Xlater 500
    第十九届2000年
    Xiph Xlater 5000
    Xiph Xlater 10000
    
    重要假设:此解决方案假设任何数字都不会超过40位。虽然这在当前的实际情况中是正确的,但如果出现此限制不足的情况,则很容易修改此解决方案,以接受限制值作为外部/全局参数

    最后,性能方面:

    function alphanum(a, b) {
      function chunkify(t) {
        var tz = [], x = 0, y = -1, n = 0, i, j;
    
        while (i = (j = t.charAt(x++)).charCodeAt(0)) {
          var m = (i == 46 || (i >=48 && i <= 57));
          if (m !== n) {
            tz[++y] = "";
            n = m;
          }
          tz[y] += j;
        }
        return tz;
      }
    
      var aa = chunkify(a);
      var bb = chunkify(b);
    
      for (x = 0; aa[x] && bb[x]; x++) {
        if (aa[x] !== bb[x]) {
          var c = Number(aa[x]), d = Number(bb[x]);
          if (c == aa[x] && d == bb[x]) {
            return c - d;
          } else return (aa[x] > bb[x]) ? 1 : -1;
        }
      }
      return aa.length - bb.length;
    }
    
    <t>
     <str>Allegia 6R Clasteron</str>
     <str>200X Radonius</str>
     <str>Xiph Xlater 10000</str>
     <str>1000X Radonius Maximus</str>
     <str>Callisto Morphamax 6000 SE</str>
     <str>10X Radonius</str>
     <str>20X Radonius</str>
     <str>30X Radonius</str>
     <str>20X Radonius Prime</str>
     <str>40X Radonius</str>
     <str>Allegia 50 Clasteron</str>
     <str>Allegia 500 Clasteron</str>
     <str>Allegia 50B Clasteron</str>
     <str>Allegia 51 Clasteron</str>
     <str>Alpha 100</str>
     <str>Alpha 2</str>
     <str>Alpha 200</str>
     <str>Alpha 2A</str>
     <str>Alpha 2A-8000</str>
     <str>Alpha 2A-900</str>
     <str>Callisto Morphamax</str>
     <str>Callisto Morphamax 500</str>
     <str>Callisto Morphamax 5000</str>
     <str>Callisto Morphamax 600</str>
     <str>Callisto Morphamax 6000 SE2</str>
     <str>Callisto Morphamax 700</str>
     <str>Callisto Morphamax 7000</str>
     <str>Xiph Xlater 2000</str>
     <str>Xiph Xlater 300</str>
     <str>Xiph Xlater 40</str>
     <str>Xiph Xlater 5</str>
     <str>Xiph Xlater 50</str>
     <str>Xiph Xlater 500</str>
     <str>Xiph Xlater 5000</str>
     <str>Xiph Xlater 58</str>
    </t>
    
    <t>
       <str>10X Radonius</str>
       <str>20X Radonius</str>
       <str>20X Radonius Prime</str>
       <str>30X Radonius</str>
       <str>40X Radonius</str>
       <str>200X Radonius</str>
       <str>1000X Radonius Maximus</str>
       <str>Allegia 6R Clasteron</str>
       <str>Allegia 50 Clasteron</str>
       <str>Allegia 50B Clasteron</str>
       <str>Allegia 51 Clasteron</str>
       <str>Allegia 500 Clasteron</str>
       <str>Alpha 2</str>
       <str>Alpha 2A</str>
       <str>Alpha 2A-900</str>
       <str>Alpha 2A-8000</str>
       <str>Alpha 100</str>
       <str>Alpha 200</str>
       <str>Callisto Morphamax</str>
       <str>Callisto Morphamax 500</str>
       <str>Callisto Morphamax 600</str>
       <str>Callisto Morphamax 700</str>
       <str>Callisto Morphamax 5000</str>
       <str>Callisto Morphamax 6000 SE</str>
       <str>Callisto Morphamax 6000 SE2</str>
       <str>Callisto Morphamax 7000</str>
       <str>Xiph Xlater 5</str>
       <str>Xiph Xlater 40</str>
       <str>Xiph Xlater 50</str>
       <str>Xiph Xlater 58</str>
       <str>Xiph Xlater 300</str>
       <str>Xiph Xlater 500</str>
       <str>Xiph Xlater 2000</str>
       <str>Xiph Xlater 5000</str>
       <str>Xiph Xlater 10000</str>
    </t>
    
    在我8岁的奔腾单核3GHz CPU、2GB RAM计算机上,处理与上述类似的XML文档,但拥有1700个
    str
    元素需要0.659秒

    说明

    function alphanum(a, b) {
      function chunkify(t) {
        var tz = [], x = 0, y = -1, n = 0, i, j;
    
        while (i = (j = t.charAt(x++)).charCodeAt(0)) {
          var m = (i == 46 || (i >=48 && i <= 57));
          if (m !== n) {
            tz[++y] = "";
            n = m;
          }
          tz[y] += j;
        }
        return tz;
      }
    
      var aa = chunkify(a);
      var bb = chunkify(b);
    
      for (x = 0; aa[x] && bb[x]; x++) {
        if (aa[x] !== bb[x]) {
          var c = Number(aa[x]), d = Number(bb[x]);
          if (c == aa[x] && d == bb[x]) {
            return c - d;
          } else return (aa[x] > bb[x]) ? 1 : -1;
        }
      }
      return aa.length - bb.length;
    }
    
    <t>
     <str>Allegia 6R Clasteron</str>
     <str>200X Radonius</str>
     <str>Xiph Xlater 10000</str>
     <str>1000X Radonius Maximus</str>
     <str>Callisto Morphamax 6000 SE</str>
     <str>10X Radonius</str>
     <str>20X Radonius</str>
     <str>30X Radonius</str>
     <str>20X Radonius Prime</str>
     <str>40X Radonius</str>
     <str>Allegia 50 Clasteron</str>
     <str>Allegia 500 Clasteron</str>
     <str>Allegia 50B Clasteron</str>
     <str>Allegia 51 Clasteron</str>
     <str>Alpha 100</str>
     <str>Alpha 2</str>
     <str>Alpha 200</str>
     <str>Alpha 2A</str>
     <str>Alpha 2A-8000</str>
     <str>Alpha 2A-900</str>
     <str>Callisto Morphamax</str>
     <str>Callisto Morphamax 500</str>
     <str>Callisto Morphamax 5000</str>
     <str>Callisto Morphamax 600</str>
     <str>Callisto Morphamax 6000 SE2</str>
     <str>Callisto Morphamax 700</str>
     <str>Callisto Morphamax 7000</str>
     <str>Xiph Xlater 2000</str>
     <str>Xiph Xlater 300</str>
     <str>Xiph Xlater 40</str>
     <str>Xiph Xlater 5</str>
     <str>Xiph Xlater 50</str>
     <str>Xiph Xlater 500</str>
     <str>Xiph Xlater 5000</str>
     <str>Xiph Xlater 58</str>
    </t>
    
    <t>
       <str>10X Radonius</str>
       <str>20X Radonius</str>
       <str>20X Radonius Prime</str>
       <str>30X Radonius</str>
       <str>40X Radonius</str>
       <str>200X Radonius</str>
       <str>1000X Radonius Maximus</str>
       <str>Allegia 6R Clasteron</str>
       <str>Allegia 50 Clasteron</str>
       <str>Allegia 50B Clasteron</str>
       <str>Allegia 51 Clasteron</str>
       <str>Allegia 500 Clasteron</str>
       <str>Alpha 2</str>
       <str>Alpha 2A</str>
       <str>Alpha 2A-900</str>
       <str>Alpha 2A-8000</str>
       <str>Alpha 100</str>
       <str>Alpha 200</str>
       <str>Callisto Morphamax</str>
       <str>Callisto Morphamax 500</str>
       <str>Callisto Morphamax 600</str>
       <str>Callisto Morphamax 700</str>
       <str>Callisto Morphamax 5000</str>
       <str>Callisto Morphamax 6000 SE</str>
       <str>Callisto Morphamax 6000 SE2</str>
       <str>Callisto Morphamax 7000</str>
       <str>Xiph Xlater 5</str>
       <str>Xiph Xlater 40</str>
       <str>Xiph Xlater 50</str>
       <str>Xiph Xlater 58</str>
       <str>Xiph Xlater 300</str>
       <str>Xiph Xlater 500</str>
       <str>Xiph Xlater 2000</str>
       <str>Xiph Xlater 5000</str>
       <str>Xiph Xlater 10000</str>
    </t>
    
  • 这是一个两遍的解决方案

  • 在第一个过程中,所有节点都按“原样”复制,但每个
    str
    元素都添加了
    sortMe
    属性。该属性包含
    str
    的唯一文本节点子节点的字符串值,其中任何数字都用空格填充,总固定长度为40

  • 在pass2中,我们使用单个排序键(即
    sortMe
    属性)按字母顺序对所有
    str
    元素进行排序

  • 现在,回答所有4个原始问题

    function alphanum(a, b) {
      function chunkify(t) {
        var tz = [], x = 0, y = -1, n = 0, i, j;
    
        while (i = (j = t.charAt(x++)).charCodeAt(0)) {
          var m = (i == 46 || (i >=48 && i <= 57));
          if (m !== n) {
            tz[++y] = "";
            n = m;
          }
          tz[y] += j;
        }
        return tz;
      }
    
      var aa = chunkify(a);
      var bb = chunkify(b);
    
      for (x = 0; aa[x] && bb[x]; x++) {
        if (aa[x] !== bb[x]) {
          var c = Number(aa[x]), d = Number(bb[x]);
          if (c == aa[x] && d == bb[x]) {
            return c - d;
          } else return (aa[x] > bb[x]) ? 1 : -1;
        }
      }
      return aa.length - bb.length;
    }
    
    <t>
     <str>Allegia 6R Clasteron</str>
     <str>200X Radonius</str>
     <str>Xiph Xlater 10000</str>
     <str>1000X Radonius Maximus</str>
     <str>Callisto Morphamax 6000 SE</str>
     <str>10X Radonius</str>
     <str>20X Radonius</str>
     <str>30X Radonius</str>
     <str>20X Radonius Prime</str>
     <str>40X Radonius</str>
     <str>Allegia 50 Clasteron</str>
     <str>Allegia 500 Clasteron</str>
     <str>Allegia 50B Clasteron</str>
     <str>Allegia 51 Clasteron</str>
     <str>Alpha 100</str>
     <str>Alpha 2</str>
     <str>Alpha 200</str>
     <str>Alpha 2A</str>
     <str>Alpha 2A-8000</str>
     <str>Alpha 2A-900</str>
     <str>Callisto Morphamax</str>
     <str>Callisto Morphamax 500</str>
     <str>Callisto Morphamax 5000</str>
     <str>Callisto Morphamax 600</str>
     <str>Callisto Morphamax 6000 SE2</str>
     <str>Callisto Morphamax 700</str>
     <str>Callisto Morphamax 7000</str>
     <str>Xiph Xlater 2000</str>
     <str>Xiph Xlater 300</str>
     <str>Xiph Xlater 40</str>
     <str>Xiph Xlater 5</str>
     <str>Xiph Xlater 50</str>
     <str>Xiph Xlater 500</str>
     <str>Xiph Xlater 5000</str>
     <str>Xiph Xlater 58</str>
    </t>
    
    <t>
       <str>10X Radonius</str>
       <str>20X Radonius</str>
       <str>20X Radonius Prime</str>
       <str>30X Radonius</str>
       <str>40X Radonius</str>
       <str>200X Radonius</str>
       <str>1000X Radonius Maximus</str>
       <str>Allegia 6R Clasteron</str>
       <str>Allegia 50 Clasteron</str>
       <str>Allegia 50B Clasteron</str>
       <str>Allegia 51 Clasteron</str>
       <str>Allegia 500 Clasteron</str>
       <str>Alpha 2</str>
       <str>Alpha 2A</str>
       <str>Alpha 2A-900</str>
       <str>Alpha 2A-8000</str>
       <str>Alpha 100</str>
       <str>Alpha 200</str>
       <str>Callisto Morphamax</str>
       <str>Callisto Morphamax 500</str>
       <str>Callisto Morphamax 600</str>
       <str>Callisto Morphamax 700</str>
       <str>Callisto Morphamax 5000</str>
       <str>Callisto Morphamax 6000 SE</str>
       <str>Callisto Morphamax 6000 SE2</str>
       <str>Callisto Morphamax 7000</str>
       <str>Xiph Xlater 5</str>
       <str>Xiph Xlater 40</str>
       <str>Xiph Xlater 50</str>
       <str>Xiph Xlater 58</str>
       <str>Xiph Xlater 300</str>
       <str>Xiph Xlater 500</str>
       <str>Xiph Xlater 2000</str>
       <str>Xiph Xlater 5000</str>
       <str>Xiph Xlater 10000</str>
    </t>
    
    我的问题是:

    XSL是解决此特定问题的最佳排序选项吗?
    如果是,怎么办 我可以使用XSL进行自然排序吗