【问题标题】:Javascript sort a string array by last nameJavascript按姓氏对字符串数组进行排序
【发布时间】:2019-02-25 03:33:49
【问题描述】:

我有一个数组:

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 按姓氏对数组进行排序,还是有另一种不太复杂的方法来做到这一点?

【问题讨论】:

    标签: javascript arrays string sorting


    【解决方案1】:

    与其尝试重新发明轮子,不如考虑使用原生的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);

    .localeCompare() 返回一个整数,表示调用的字符串或传递的字符串是否按字母顺序排在第一位。

    【讨论】:

    • 顺便说一句,当拆分数组时,也许你应该注意再次加入所有元素,除了第一个元素,以防存在复合姓氏。
    • localeCompare() 很不错!
    • 按数字排序使用(a, b) =&gt; a.localeCompare(b, undefined, {'numeric': true})未定义的变量用于区域设置字符串
    【解决方案2】:

    这里是一个班轮

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

    【讨论】:

      【解决方案3】:

      可以使用Array.sort() 结合String.match() 和已经提到的String.localeCompare() 来解决这个问题。请注意,如果您有复合姓氏,这也将起作用。

      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() 会改变您的原始数组,如果您不希望发生这种情况,您可以在使用Array.slice() 对其进行排序之前创建数组的副本。示例:

      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);

      【讨论】:

        【解决方案4】:

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

        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;
        }

        【讨论】:

          【解决方案5】:

          另一种解决方案是使用两个 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); // a b c
          console.log(arr5.reverse()); // c b a

          【讨论】:

            【解决方案6】:
            //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)
            

            【讨论】:

              【解决方案7】:
              <!-- 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 -->
              

              【讨论】:

                【解决方案8】:

                在这里我使用.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))

                【讨论】:

                • 嘿,我对此进行了基准测试,它比.sort 快。我误以为不是。如果你在这里做一个小的编辑,我可以投票,谢谢。
                猜你喜欢
                • 2021-01-04
                • 1970-01-01
                • 1970-01-01
                • 2015-05-25
                • 1970-01-01
                • 2013-11-03
                • 1970-01-01
                • 2020-11-03
                • 1970-01-01
                相关资源
                最近更新 更多