按规则排序列表



我有一个需要排序的列表。

['Product ED', 'Product CX', 'Product XY', 'Product ED']

该列表必须按照定义的规则排序:

['CX', 'XY', 'ED']

所以,最后这个列表必须按照这个规则排序,像这样:

['Product CX', 'Product XY', 'Product ED', 'Product ED']

如何实现这样的算法?

编辑:嗯,在我写完这个问题之后,我想到了一个简单的想法……

在这里:

var l = ['Product ED', 'Product CX', 'Product XY', 'Product ED'];
var rules = ['CX', 'XY', 'ED'];
l.sort(function(a, b) {
    return rules.indexOf(a.replace(/^Product /, '')) > rules.indexOf(b.replace(/^Product /, ''));
})

("产品CX"、"产品XY","产品ED","产品ED")

快速&肮脏的方法是在每个值前加上排序键。'1产品CX', '2产品XY'等,排序,然后把它们去掉。

只要确保你附加的排序键长度相同,如果你有超过10个,你需要'01','02'等。

如果你想正确地做到这一点,那么你需要定义一个比较函数并将其作为参数传递给'sort'函数:http://www.w3schools.com/jsref/jsref_sort.asp

更正式地说,您可以定义一个比较函数,它从要排序的列表(规则列表)中获取两个元素,如果第一项大于第二项(根据规则),则返回1,如果小于-1,则返回0,如果相同。然后,任何基于比较的排序都可以工作。

复杂度:T(n) = 2T(n/2) + O(nm) =?O(m n log n)是可能的,例如归并排序…对吧?(注:n为列表中待排序元素的个数,m为规则集的大小)

jsFiddle

    var list = ['Product ED', 'Product CX', 'Product XY', 'Product ED'];
    var rule = ['CX', 'XY', 'ED'];
    list.sort(function(a, b) {
        var aIndex, bIndex;
        for (var i = 0; i < rule.length; i++) {
            var aMatch = a.match(rule[i]);
            var bMatch = b.match(rule[i]);
            if (aMatch && aMatch.length > 0) {
                aIndex = rule.indexOf(aMatch[0])
            }
            if (bMatch && bMatch.length > 0) {
                bIndex = rule.indexOf(bMatch[0]);
            }
            if (bIndex && aIndex) {
                continue;
            }
        }
        if (aIndex < bIndex) return -1;
        else if (aIndex > bIndex) return 1;
        else return 0;
    })
    console.log(list)

最新更新