我有一个像下面这样的字符串数组。
ABC
QRS
DEF
HIJ
TUV
KLM
NOP
我需要按字母顺序在javascript中对此数组进行排序,除了少数已知的值。即我需要DEF并且NOP位于前2个位置,并按字母顺序按升序对数组的其余部分进行排序。以下是我按字母顺序对整个数组进行排序的内容,现在我需要前2个位置中的2个值。
array.sort(function(a,b){return ((a < b) ? -1 : (a > b) ? 1 : 0)});
预期结果。
DEF
NOP
ABC
HIJ
KLM
QRS
TUV
数组的内容是动态的,所以如果数组有DEF或NOP,那么那些应该在顶部,否则,它应该按字母顺序排序。什么是解决这个问题的最好方法?
答案 0 :(得分:4)
我认为最直接的方法是分别删除已知元素,而不是尝试将它们合并到排序中。这样,您也可以只使用sort
而无需比较功能。
function sortWithKnownPrefix(prefix, arr) {
// Get the non-prefix elements
var rest = arr.filter(function (item) {
return prefix.indexOf(item) === -1;
});
// Concatenate the prefix and the sorted non-prefix elements
return prefix.concat(rest.sort());
}
sortWithKnownPrefix(
["DEF", "NOP"],
["ABC", "QRS", "DEF", "HIJ", "TUV", "KLM", "NOP"]
)
// ["DEF", "NOP", "ABC", "HIJ", "KLM", "QRS", "TUV"]
答案 1 :(得分:0)
如果您想允许,计算和提升这些字符串的多个实例:http://jsfiddle.net/4hgnjqas/1/
以下将计算要提升到前面的所有已知字符串实例,将它们从现有数组中删除,对其进行排序,然后将相同数量的“DEF”和“NOP”添加到数组中。
var hoist = {"NOP":0, "DEF":0}
for(var p in hoist)
while(array.indexOf(p)>-1){
array.splice(array.indexOf(p),1);
hoist[p]++;
}
arr.sort();
for(var p in hoist){
for(var i=0;i<hoist[p];i++)
array.unshift(p);
}
console.log(array);
答案 2 :(得分:0)
这可能是更简单的一个
var arr = ['ABC','QRS','DEF','HIJ','TUV','KLM','NOP']
var exclude = ['DEF', 'NOP'];
arr.sort(function(a,b) {
if(exclude.indexOf(a) > -1 && exclude.indexOf(b) > -1)
return ((a < b) ? -1 : (a > b) ? 1 : 0);
if(exclude.indexOf(b) > -1)
return 1;
return ((a < b) ? -1 : (a > b) ? 1 : 0)
});
alert(JSON.stringify(arr)) //result
JS Fiddle *更新
答案 3 :(得分:0)
这将重新定位&#39; DEF&#39;和#NOP&#39;在对其余项目进行排序后:
function customSort(array) {
array = array.sort(function(a,b){
return (a < b) ? -1 : (a > b) ? 1 : 0;
});
var NOPIndex = array.indexOf('NOP');
if (NOPIndex > -1)
array.unshift(array.splice(NOPIndex, 1)[0]);
var DEFIndex = array.indexOf('DEF');
if (DEFIndex > -1)
array.unshift(array.splice(DEFIndex, 1)[0]);
return array;
}