2011-08-02 40 views
1

我有我需要排序的列表。按规则对列表排序

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

那么,快速的&脏方式将是用排序键预置每个值。 '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)=∞(3)其中, O(m n log n)是可能的,例如, mergesort ...对吗? (注:n是要排序的列表中元素的数量,m是规则集的大小)。

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)