在javascript中按两个或多个子字符串对字符串数组进行排序

时间:2015-09-03 14:28:27

标签: javascript arrays sorting

我有一个javascript数组,如下所示:

var data =  ["size64_tolPercent0.01_best", "size256_tolPercent0.01_best", "size256_tolPercent0_worst", "sizemax_tolPercent0_worst", "size1518_tolPercent0_worst", "size64_tolPercent0.01_worst", "size512_tolPercent0.01_worst", "size1518_tolPercent0.01_worst", "size256_tolPercent0_best"] etc

我想对这个数组进行排序:

  1. by substring" best"和#34;最差"。
  2. 由tolPercents 0和0.01
  3. 尺寸(64,256,512,1518,最大)..如果尺寸按字符串排序会很好,因为它包含" max"关键字..
  4. 因此,我们最终得到一个如下所示的结果数组:

    ["size64_tolPercent0_best", "size256_tolPercent0_best", "size512_tolPercent0_best", "size1518_tolPercent0_best", "sizemax_tolPercent0_best", "size64_tolPercent0.01_best", "size512_tolPercent0.01_best", "size1518_tolPercent0.01_best", "size64_tolPercent0_worst", "size256_tolPercent0_worst", "size512_tolPercent0_worst", "size1518_tolPercent0_worst", "sizemax_tolPercent0_worst"] etc
    

    我可以使用其中一种方法对字符串进行排序,但不是全部。

    这是我到目前为止所做的尝试,我做错了我确定,只需要一些正确方向的帮助。现在为1和3做:

    var someLargeValue = 10000000;
    data.sort(function(x,y){
      var xp = x.substr(getPosition(x, '_', 2) + 1, x.split("_").pop().length);
      var yp = y.substr(getPosition(y, '_', 2) + 1, y.split("_").pop().length);
      return xp == yp ? 0 : xp < yp ? -1 : 1;
    });
    data.sort(function(x,y){
      var xp = x.substr(4, getPosition(x, '_', 1) - 4);
      var yp = y.substr(4, getPosition(y, '_', 1) - 4);
      if(xp === "max") {
        xp = someLargeValue;
      }
      if(yp === "max") {
        yp = someLargeValue;
      }
      xp = parseInt(xp);
      yp = parseInt(yp);
    
      return xp == yp ? 0 : xp < yp ? -1 : 1;
    });
    function getPosition(str, m, i) {
        return str.split(m, i).join(m).length;
    }
    

    但是我担心我正在尝试的代码是按顺序进行排序。所以我认为第二种自定义排序方法被第二种方式覆盖了吗?

    任何帮助都非常感激。

3 个答案:

答案 0 :(得分:2)

我首先要拆分字符串,以便最大限度地减少比较函数的工作量,并使其更具可读性。然后,我会在数组排序后重新创建字符串。使用地图更聪明:https://stackoverflow.com/a/32379540/1636522 :-D

&#13;
&#13;
var data = ["size64_tolPercent0_best", "size256_tolPercent0_best", "size512_tolPercent0_best", "size1518_tolPercent0_best", "sizemax_tolPercent0_best", "size64_tolPercent0.01_best", "size512_tolPercent0.01_best", "size1518_tolPercent0.01_best", "size64_tolPercent0_worst", "size256_tolPercent0_worst", "size512_tolPercent0_worst", "size1518_tolPercent0_worst", "sizemax_tolPercent0_worst"];

// split the strings

var re = /max|\d+(?:\.\d+)?(?=_)|[^_]+$/g;

data = data.map(function (x) {
  x = x.match(re); // example: ["64", "0.01", "best"]
  if (x[0] !== 'max') x[0] = parseInt(x[0], 10);
  x[1] = parseFloat(x[1]);
  return x;
});

// sort the array

data.sort(function cmp (a, b) {
  // 1. "best" and "worst"
  if (a[2] > b[2]) return 1;
  if (a[2] < b[2]) return -1;
  // 2. percent
  if (a[1] > b[1]) return 1;
  if (a[1] < b[1]) return -1;
  // 3. size
  if (a[0] === 'max') return 1;
  if (b[0] === 'max') return -1;
  if (a[0] > b[0]) return 1;
  if (a[0] < b[0]) return -1;
  // 4. no differences
  return 0;
});

// recreate the strings

data = data.map(function (x) {
  x[0] = 'size' + x[0];
  x[1] = 'tolPercent' + x[1];
  return x.join('_');
});

// print the result

data.forEach(function (x) {
  document.write(x + '<br />');
});
&#13;
* {font-family:Courier}
&#13;
&#13;
&#13;

答案 1 :(得分:2)

此解决方案以MDN的Sorting with map为特色。

首先使用拆分项构建一个映射数组以进行排序。然后按自定义顺序对其进行排序。

VolleyResponseListener

共:

public interface VolleyResponseListener {
    void onError(String message);

    void onResponse(Object response);
}

答案 2 :(得分:0)

Array类有一个排序函数:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

利用compare参数:

data.sort(function(a, b) { // Follow the docs as per how a relates to b, returning -1 (a < b),0 (equal) or 1 (a > b) });

根据函数的要求提取并比较子字符串。

<强>更新
阅读完您添加的代码后,不要再调用sort()两次,只需将所有比较合并到相同的排序比较中。停在第一个不等式(aValue !== bValue)并返回该比较。