2012-05-13 90 views
4

我需要帮助排序通过一些数据。 说我在搜索字段中键入“piz”。我得到所有包含“piz”的条目并返回数组。Javascript按字母顺序匹配字符串的开头,然后按字母顺序排序包含的文本

我现在想按以下顺序来显示他们:

pizza 
pizzeria 
apizzetto 
berpizzo 

先说什么我按字母顺序排列,然后包含什么,我按字母顺序输入的输入那些启动项。

相反,如果我按字母顺序排序他们,我得到以下

apizzetto 
berpizzo 
pizza 
pizzeria 

有谁知道如何做到这一点? 感谢您的帮助。

回答

5

您可以将数据拆分为两个数组,一个以您的输入开始,另一个不以。排序各自独立,然后再结合两个结果:

var data = [ 
    'pizzeria', 
    'berpizzo', 
    'apizzetto', 
    'pizza' 
]; 

function sortInputFirst(input, data) { 
    var first = []; 
    var others = []; 
    for (var i = 0; i < data.length; i++) { 
     if (data[i].indexOf(input) == 0) { 
      first.push(data[i]); 
     } else { 
      others.push(data[i]); 
     } 
    } 
    first.sort(); 
    others.sort(); 
    return(first.concat(others)); 
} 

var results = sortInputFirst('piz', data); 

你可以看到它在这里工作:http://jsfiddle.net/jfriend00/nH2Ff/

+0

是的,如果indexOf ...> 0,'else'应该是else,以消除不匹配的元素。 – georg

+0

非常好。奇迹般有效。必须做一些修改以确保小写匹配。但这是另一个话题。非常感谢你! –

+0

@ thg435 - 如果仔细阅读问题,初始数组已被筛选为仅包含搜索词的单词。 – jfriend00

0

这里的另一个问题:

var str = 'piz'; 
var arr = ['apizzetto','pizzeria','berpizzo','pizza']; 

arr.sort(function(a,b) { 
    var bgnA = a.substr(0,str.length).toLowerCase(); 
    var bgnB = b.substr(0,str.length).toLowerCase(); 

    if (bgnA == str.toLowerCase()) { 
     if (bgnB != str.toLowerCase()) return -1; 
    } else if (bgnB == str.toLowerCase()) return 1; 
    return a < b ? -1 : (a > b ? 1 : 0); 
}); 

console.log(arr); 
2

正确的完整的解决方案是:

var data = [ 
    'pizzeria', 
    'berpizzo', 
    'apizzetto', 
    'pizza' 
]; 

var _sortByTerm = function (data, term) { 
    return data.sort(function (a, b) { 
     return a.indexOf(term) < b.indexOf(term) ? -1 : 1; 
    }); 
}; 

var result = _sortByTerm(data, 'piz'); 

如果要对象排序,请使用此功能:

var _sortByTerm = function (data, key, term) { 
    return data.sort(function (a, b) { 
     return a[key].indexOf(term) < b[key].indexOf(term) ? -1 : 1; 
    }); 
}; 
+0

这应该被标记为正确的答案。 – nickb