Javascript按字母顺序匹配字符串的开头,然后按字母顺序排序包含的文本
问题描述:
我需要帮助排序通过一些数据。 说我在搜索字段中键入“piz”。我得到所有包含“piz”的条目并返回数组。Javascript按字母顺序匹配字符串的开头,然后按字母顺序排序包含的文本
我现在想按以下顺序来显示他们:
pizza
pizzeria
apizzetto
berpizzo
先说什么我按字母顺序排列,然后包含什么,我按字母顺序输入的输入那些启动项。
相反,如果我按字母顺序排序他们,我得到以下
apizzetto
berpizzo
pizza
pizzeria
有谁知道如何做到这一点? 感谢您的帮助。
答
您可以将数据拆分为两个数组,一个以您的输入开始,另一个不以。排序各自独立,然后再结合两个结果:
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/
答
这里的另一个问题:
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);
答
正确的完整的解决方案是:
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
是的,如果indexOf ...> 0,'else'应该是else,以消除不匹配的元素。 – georg
非常好。奇迹般有效。必须做一些修改以确保小写匹配。但这是另一个话题。非常感谢你! –
@ thg435 - 如果仔细阅读问题,初始数组已被筛选为仅包含搜索词的单词。 – jfriend00