按规则排序列表

时间:2011-08-02 15:27:18

标签: javascript sorting

我有一个我需要排序的清单。

['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']

3 个答案:

答案 0 :(得分:1)

嗯,快速&脏的方法是用排序键前置每个值。 '1Product CX','2Product XY'等,对其进行分类,然后将其剥离。

确保你追加的排序键长度相同,如果你的数量超过10,你需要'01','02'等。

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

答案 1 :(得分:1)

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

复杂性:T(n)= 2T(n / 2)+ O(nm)=?例如,O(m n log n)是可能的。合并......对吗? (注意:n是要排序的列表中的元素数,m是规则集的大小)。

答案 2 :(得分:1)

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)