2016-08-18 46 views
0

我有一個具有像這樣項的數組:如何通過2個屬性對數組進行排序? (正則表達式)

var myArray = 
[ 
{catNum : 'CAT I #4', trackingNumber : 'ORG Cat-123'}, 
{catNum : 'CAT I #6', trackingNumber : 'ORG Dog-345'}, 
{catNum : 'CAT I #2', trackingNumber : 'ORG Cat-123'}, 
{catNum : 'CAT I #2', trackingNumber : 'ORG Cat-345'}, 
{catNum : 'CAT II #15', trackingNumber : 'ORG Fish-264'}, 
{catNum : 'CAT III #1', trackingNumber : 'ORG Bird-123'}, 
{catNum : 'CAT II #7', trackingNumber : 'ORG Dog-533'}, 
] 

欲由catNum對數組進行排序,並且如果catNum是相同的,然後排序由跟蹤號碼。

在下面的代碼,我能夠通過第一個屬性進行排序(即:CATI# - > CAT II# - > CAT III#):

myArray.sort(function mySort(a, b) 
       { 
        return catTrackSort(a, b); 
       }); 

function catTrackSort(a, b) 
     { 
      var left = a.catNum.match(/CAT ([IV]+) #([0-9]+)/); 
      var right = b.catNum.match(/CAT ([IV]+) #([0-9]+)/); 

      if (left[1].length === right[1].length) 
      { 
       return left[2] - right[2]; 
      } 
      else 
      { 
       return left[1].length - right[1].length; 
      } 
     } 

在比較功能,如果catNum是相同的,我想通過在trackingNumber property--我曾嘗試以下字母順序進行排序,但它不排序:

function catTrackSort(a, b) 
     { 
      var left = a.catNum.match(/CAT ([IV]+) #([0-9]+)/); 
      var right = b.catNum.match(/CAT ([IV]+) #([0-9]+)/); 

      if (left[1].length === right[1].length) 
      { 
       if (left[2] === right[2]) 
       { 
        var left1 = a.trackingNumber.match(/ORG ([A-Z]+)/); 
        var right2 = b.trackingNumber.match(/ORG ([A-Z]+)/); 

        return left1[1] - right1[1]; 
       } 

       else return left[2] - right[2]; 
      } 
      else 
      { 
       return left[1].length - right[1].length; 
      } 
     } 

如何糾正這種任何想法?

+0

如果您的問題是按字母順序排序,請嘗試'xxx'.localeCompare('yyy'); – folkol

回答

0

這個怎麼樣?

function catTrackSort(a, b) 
{ 
    if (a.catNum == b.catNum) { 
     // in case the tracking nums are also equal, return 0 to leave order unchanged 
     if (a.trackingNumber == b.trackingNumber) { 
      return 0; 
     } 

     // try sorting the tracking nums alphabetically 
     var testABC = [a.trackingNumber, b.trackingNumber] 
     testABC.sort() // default behavior is to sort by ABC 

     // check if the test array changed order 
     if (testABC[0] == a.trackingNumber) { 
      return -1; 
     } 
     else { 
      return 1; 
     } 
    } 
    else { 
     // logic to sort by catNum goes here 
    } 
} 

似乎在我的fiddle工作正常。

+0

abc是哪裏定義的? –

+0

對不起,我錯過了本地'var'聲明;)剛編輯添加。 – chris

+0

生病了,試試看,當我回家,謝謝! –

1

您可以使用Sorting with map並使用sort參數構建一個新數組。

mapped.sort(function (a, b) { 
    return a.cn[0] - b.cn[0] || a.cn[1] - b.cn[1] || a.tn[0].localeCompare(b.tn[0]) || a.tn[1] - b.tn[1]; 
    //  roman number   arabic number    organisation    number of org  
}); 

var myArray = [{ catNum: 'CAT I #4', trackingNumber: 'ORG Cat-123' }, { catNum: 'CAT I #6', trackingNumber: 'ORG Dog-345' }, { catNum: 'CAT I #2', trackingNumber: 'ORG Cat-123' }, { catNum: 'CAT I #2', trackingNumber: 'ORG Cat-345' }, { catNum: 'CAT II #15', trackingNumber: 'ORG Fish-264' }, { catNum: 'CAT III #1', trackingNumber: 'ORG Bird-123' }, { catNum: 'CAT II #7', trackingNumber: 'ORG Dog-533' }], 
 
    mapped = myArray.map(function (a, i) { 
 
     var cn = a.catNum.match(/CAT ([IV]+) #([0-9]+)/), 
 
      tn = a.trackingNumber.match(/ORG ([A-Z]+)-([0-9]+)/i); 
 
     cn.shift(); 
 
     cn[0] = { I: 1, II: 2, III: 3, IV: 4, V: 5, VI: 6, VII: 7, VIII: 8 }[cn[0]]; 
 
     tn.shift(); 
 
     return { index: i, cn: cn, tn: tn }; 
 
    }), 
 
    result; 
 

 
mapped.sort(function (a, b) { 
 
    return a.cn[0] - b.cn[0] || a.cn[1] - b.cn[1] || a.tn[0].localeCompare(b.tn[0]) || a.tn[1] - b.tn[1]; 
 
}); 
 

 
result = mapped.map(function (el) { 
 
    return myArray[el.index]; 
 
}); 
 

 
console.log(result);

-1

我的JavaScript是沒有這麼熱,但在這裏是如何做到這一點在C#中的人誰是有興趣的一個例子。

// Set up some sample data 
var numbers = new List<Tuple<int, int>>(); 
var rand = new Random((int)DateTime.Now.Ticks); 

for(int i = 0; i < 100; i++) 
{ 
    numbers.Add(new Tuple<int, int>(rand.Next(10), rand.Next(10))); 
} 

// Get a collection of groups of the first item in the tuple 
var groups = numbers.GroupBy(n => n.Item1).OrderBy(g => g.Key).ToList(); 

List<Tuple<int, int>> sortedNumbers = new List<Tuple<int, int>>(); 

// Create a new list by ordering each group by the second item in the tuple 
groups.ForEach(g => sortedNumbers.AddRange(g.OrderBy(n => n.Item2))); 

sortedNumbers.ForEach(sn => Console.WriteLine($"{sn.Item1} {sn.Item2}")); 
相關問題