javascript中数组的手动排序

javascript中数组的手动排序,javascript,sorting,Javascript,Sorting,我有一个字符串数组,如下所示 ABC QRS DEF HIJ TUV KLM NOP 我需要在javascript中按字母顺序对这个数组进行排序,除了一些已知的值。ie我需要DEF和NOP位于前2个位置,并按字母升序对数组的其余部分排序。下面是我写的按字母顺序对整个数组排序的内容,现在我需要前2个位置的2个值 array.sort(function(a,b){return ((a < b) ? -1 : (a > b) ? 1 : 0)}); 数组的内容是动态的,因此如果数组有D

我有一个字符串数组,如下所示

ABC
QRS
DEF
HIJ
TUV
KLM
NOP
我需要在javascript中按字母顺序对这个数组进行排序,除了一些已知的值。ie我需要DEF和NOP位于前2个位置,并按字母升序对数组的其余部分排序。下面是我写的按字母顺序对整个数组排序的内容,现在我需要前2个位置的2个值

array.sort(function(a,b){return ((a < b) ? -1 : (a > b) ? 1 : 0)});

数组的内容是动态的,因此如果数组有DEF或NOP,那么这些内容应该在顶部,否则应该按字母顺序排序。最好的方法是什么?

我认为最直接的方法是分别删除已知元素,而不是尝试将它们合并到排序中。这样,您也可以在不使用比较函数的情况下进行排序

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"]

我认为最直接的方法是分别删除已知元素,而不是尝试将它们合并到排序中。这样,您也可以在不使用比较函数的情况下进行排序

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"]

如果要允许、计算并提升这些字符串的多个实例:

下面将计算要提升到前面的字符串的所有已知实例,将它们从现有阵列中移除,对其进行排序,然后将相同数量的“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);
var-hugh={“NOP”:0,“DEF”:0}
用于(起重机中的var p)
while(array.indexOf(p)>-1){
阵列拼接(阵列索引f(p),1);
起重机[p]++;
}
arr.sort();
用于(起重机中的var p){

对于(var i=0;i,如果您希望允许,则计算并提升这些字符串的多个实例:

下面将计算要提升到前面的字符串的所有已知实例,将它们从现有阵列中移除,对其进行排序,然后将相同数量的“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);
var-hugh={“NOP”:0,“DEF”:0}
用于(起重机中的var p)
while(array.indexOf(p)>-1){
阵列拼接(阵列索引f(p),1);
起重机[p]++;
}
arr.sort();
用于(起重机中的var p){

对于(var i=0;i这可能是更简单的一个

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
var arr=['ABC'、'QRS'、'DEF'、'HIJ'、'TUV'、'KLM'、'NOP']
var exclude=['DEF','NOP'];
arr.sort(函数(a,b){
if(exclude.indexOf(a)>-1&&exclude.indexOf(b)>-1)
回报率((ab)-1:0);
if(排除(b)>-1的索引)
返回1;
回报率((ab)?1:0)
});
警报(JSON.stringify(arr))//结果

*更新

这可能是更简单的一个

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
var arr=['ABC'、'QRS'、'DEF'、'HIJ'、'TUV'、'KLM'、'NOP']
var exclude=['DEF','NOP'];
arr.sort(函数(a,b){
if(exclude.indexOf(a)>-1&&exclude.indexOf(b)>-1)
回报率((ab)-1:0);
if(排除(b)>-1的索引)
返回1;
回报率((ab)?1:0)
});
警报(JSON.stringify(arr))//结果

*已更新

这将在对其余项目排序后重新定位“DEF”和“NOP”:

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;

}
函数自定义排序(数组){
array=array.sort(函数(a,b){
返回值(ab)-1:0;
});
var NOPIndex=array.indexOf('NOP');
如果(索引>-1)
array.unshift(array.splice(NOPIndex,1)[0]);
var DEFIndex=array.indexOf('DEF');
如果(定义索引>-1)
array.unshift(array.splice(DEFIndex,1)[0]);
返回数组;
}

这将在对其余项目排序后重新定位“DEF”和“NOP”:

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;

}
函数自定义排序(数组){
array=array.sort(函数(a,b){
返回值(ab)-1:0;
});
var NOPIndex=array.indexOf('NOP');
如果(索引>-1)
array.unshift(array.splice(NOPIndex,1)[0]);
var DEFIndex=array.indexOf('DEF');
如果(定义索引>-1)
array.unshift(array.splice(DEFIndex,1)[0]);
返回数组;
}

Nice,除了'DEF'和'NOP'的顺序颠倒。这看起来不错,但我需要在结果数组中保持排除数组的顺序。Nice,除了'DEF'和'NOP'的顺序颠倒。这看起来不错,但我需要在结果数组中保持排除数组的顺序。。