繁体   English   中英

如何按2个属性对数组排序? (正则表达式)

[英]How can I sort an array by 2 properties? (regex)

我有一个数组,有这样的项目:

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;
            }
        }

在compare函数中,如果catNum相同,我想在trackingNumber属性上按字母顺序排序-我已经尝试了以下方法,但是没有排序:

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;
            }
        }

关于如何纠正这一点的任何想法?

您可以对地图使用排序,并使用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 ([AZ]+)-([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); 

这个怎么样?

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
    }
}

看来我的小提琴工作还可以。

我的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}"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM