当前位置: 代码迷 >> JavaScript >> Javascript按姓氏对字符串数组进行排序
  详细解决方案

Javascript按姓氏对字符串数组进行排序

热度:89   发布时间:2023-06-05 14:03:22.0

我有一个数组:

arr4=["John Alpha","Allen Beta", "Elle Cappa"];

我有一个排序函数,可以将字符串数组按降序排序

function getSize(arr){
return arr.length;
}

function sortStringArrDes(arr){
arrSize=getSize(arr);
var temp;
for(j=0; j<arrSize-1; j++){
    for(i=0; i<arrSize-1; i++){
        if (arr[i] < arr[i+1]){
            temp = arr[i+1];
            arr[i+1] = arr[i];
            arr[i] = temp;
            }
        }
    }
    return arr;
}

我可以使用 sortStringArrDes 按姓氏对数组进行排序,还是有另一种不太复杂的方法来做到这一点?

您可以考虑使用本机Array.prototype.sort方法,而不是尝试重新发明轮子:

 const arr4 = ["John Alpha", "Elle Cappa", "Allen Beta"]; arr4.sort((a, b) => b.split(' ')[1].localeCompare(a.split(' ')[1])); console.log(arr4); 

返回一个整数,该整数表示调用的字符串还是传递的字符串按字母顺序排在首位。

这是一个班轮

arr4.sort(x => arr4.map(y => y.split(' ')[1]) ).reverse()

结合和已经提到的可以解决此问题。 请注意,如果您有复合姓氏,这也将起作用。

 const input = ["John Alpha", "Elle Cappa", "Allen Beta", "Rob Collyses Chung"]; input.sort( (a, b) => b.match(/\\s(.+)/)[1].localeCompare(a.match(/\\s(.+)/)[1]) ); console.log(input); 

更重要的是,您还应该注意Array.sort()会改变原始数组,如果您不希望发生这种情况,则可以在使用对其进行排序之前,先创建该数组的副本。 例:

 const input = ["John Alpha", "Elle Cappa", "Allen Beta", "Rob Collyses Chung"]; let res = input.slice().sort( (a, b) => b.match(/\\s(.+)/)[1].localeCompare(a.match(/\\s(.+)/)[1]) ); console.log("Original is not mutated: ", input); console.log("Sorted copy: ", res); 

您可以创建一个如下所示的比较函数,并使用按姓氏排序

 var names = ["Allen Beta", "John Alpha", "Elle Cappa"]; var sortedNames = names.sort(compare); console.log(sortedNames); function compare(a, b) { var splitA = a.split(" "); var splitB = b.split(" "); var lastA = splitA[splitA.length - 1]; var lastB = splitB[splitB.length - 1]; if (lastA < lastB) return -1; if (lastA > lastB) return 1; return 0; } 

另一个解决方案是使用两个for循环,拆分每个数组项,将其反转并排序。 然后将其排序后反转,然后将其重新结合在一起。 参见下面的代码:

 var arr4=["Allen Beta", "John Alpha", "Elle Cappa"]; var arr5 = []; // Keep the original array as is. for(var i = 0; i < arr4.length; i++){ arr5[i] = arr4[i].split(" ").reverse().join(" "); } arr5.sort(); for(var i = 0; i < arr5.length; i++){ arr5[i] = arr5[i].split(" ").reverse().join(" "); } console.log(arr5); // abc console.log(arr5.reverse()); // cba 

//Try this way    

    let arr = [`John Alpha`,`Allen Beta`,`Elle Cappa`];
    let new_arr=arr.map(item=>{
        return item.split(' ');
    })
    let sorting = new_arr.sort((a,b)=>{
        return b[b.length-1].localeCompare(a[a.length-1]);
    })
    let merging= sorting.map(item=>{
        return item.join(' ');
    })
    console.log(merging)
<!-- language: lang-js -->

    let arr = [`John Alpha`,`Allen Beta`,`Elle Cappa`];

    var newarr=[];

    for(x=0;x<arr.length;x++){
    var z=arr[x].split(" ");
    var z=z.reverse();
    newarr[x]=z;
    }

var v=newarr.sort();

var v=v.reverse();

    console.log(v);

<!-- end snippet -->

在这里,我使用.split(' ')[1]获取条件的姓氏,并且看起来可以正常工作。

 arr4=["John Alpha","Allen Beta", "Elle Cappa"]; function sortStringArrDes(arr){ arrSize=arr.length; var temp; for(j=0; j<arrSize-1; j++){ for(i=0; i<arrSize-1; i++){ if (arr[i].split(' ')[1] < arr[i+1].split(' ')[1]){ temp = arr[i+1]; arr[i+1] = arr[i]; arr[i] = temp; } } } return arr; } console.log(sortStringArrDes(arr4)) 

  相关解决方案