【问题标题】:How to sort an array based on the length of each element?如何根据每个元素的长度对数组进行排序?
【发布时间】:2012-05-24 17:41:54
【问题描述】:

我有一个这样的数组:

arr = []
arr[0] = "ab"
arr[1] = "abcdefgh"
arr[2] = "abcd"

排序后的输出数组应该是:

arr[0] = "abcdefgh"
arr[1] = "abcd"
arr[2] = "ab"  

我希望在descending 顺序中每个元素的长度。

【问题讨论】:

  • sort 很直接,你哪里有困难?
  • @muistooshort 以及默认 sort() 按字母顺序对字符串进行排序,他正在寻找 string.length 排序,如所选答案中所示:)

标签: javascript arrays string sorting


【解决方案1】:

您可以使用Array.sort 方法对数组进行排序。一个以字符串长度为排序标准的排序函数可以使用如下:

arr.sort(function(a, b){
  // ASC  -> a.length - b.length
  // DESC -> b.length - a.length
  return b.length - a.length;
});

注意:["a", "b", "c"] 按字符串长度排序不保证返回["a", "b", "c"]。根据the specs

排序不一定是稳定的(即比较的元素 equal 不一定保持原来的顺序)。

如果目标是按长度排序,然后按字典顺序,您必须指定附加条件:

["c", "a", "b"].sort(function(a, b) {
  return a.length - b.length || // sort by length, if equal then
         a.localeCompare(b);    // sort by dictionary order
});

【讨论】:

  • 我要补充一点,这会通过减少项目的长度来对数组进行排序。
  • 啊哈它在评论里 :) 一开始没看到
  • 只是添加一个信息。此 sn-p 不适用于所有情况。
  • 尝试 arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', ' k', 'l'],它会失败
  • ES6方式arr.sort((a, b) => b.length - a.length)
【解决方案2】:

我们可以使用Array.sort方法对这个数组进行排序。

ES5解决方案

var array = ["ab", "abcdefgh", "abcd"];

array.sort(function(a, b){return b.length - a.length});

console.log(JSON.stringify(array, null, '\t'));

升序排序:a.length - b.length

降序排序:b.length - a.length

ES6解决方案

注意:并非所有浏览器都能理解 ES6 代码!

在 ES6 中,我们可以使用 arrow function expressions

let array = ["ab", "abcdefgh", "abcd"];

array.sort((a, b) => b.length - a.length);

console.log(JSON.stringify(array, null, '\t'));

【讨论】:

    【解决方案3】:

    这是排序,具体取决于您询问的带有 javascript 的字符串的长度:

    [用冒泡排序解决问题][1]

    [1]:http://jsfiddle.net/sssonline2/vcme3/2/enter code here

    【讨论】:

      【解决方案4】:
      #created a sorting function to sort by length of elements of list
      def sort_len(a):
          num = len(a)
          d = {}
          i = 0
          while i<num:
              d[i] = len(a[i])
              i += 1
          b = list(d.values())
          b.sort()
          c = []
          for i in b:
              for j in range(num):
                  if j in list(d.keys()):
                      if d[j] == i:
                          c.append(a[j])
                          d.pop(j)
          return c
      

      【讨论】:

      • 单独发布代码无济于事。简要说明您的代码的作用。
      【解决方案5】:

      如果要保留与原始数组长度相同的元素的顺序,请使用冒泡排序。

      Input = ["ab","cdc","abcd","de"];
      
      Output  = ["ab","cd","cdc","abcd"]
      

      功能:

      function bubbleSort(strArray){
        const arrayLength = Object.keys(strArray).length;
          var swapp;
          var newLen = arrayLength-1;
          var sortedStrArrByLenght=strArray;
          do {
              swapp = false;
              for (var i=0; i < newLen; i++)
              {
                  if (sortedStrArrByLenght[i].length > sortedStrArrByLenght[i+1].length)
                  {
                     var temp = sortedStrArrByLenght[i];
                     sortedStrArrByLenght[i] = sortedStrArrByLenght[i+1];
                     sortedStrArrByLenght[i+1] = temp;
                     swapp = true;
                  }
              }
              newLen--;
          } while (swap);
        return sortedStrArrByLenght;
      }
      

      【讨论】:

        【解决方案6】:

        使用现代 JavaScript,您可以这样做:

        降序

        const arr = [
          "ab",
          "abcdefgh",
          "abcd",
          "abcdefghijklm"
        ];
        
        arr.sort((a, b) => b.length - a.length);
        
        console.log(JSON.stringify(arr, null, 2));

        升序 - 只需将ab 切换

        const arr = [
          "ab",
          "abcdefgh",
          "abcd",
          "abcdefghijklm"
        ];
        
        arr.sort((a, b) => a.length - b.length);
        
        console.log(JSON.stringify(arr, null, 2));

        【讨论】:

          【解决方案7】:

          根据萨尔曼的回答,我写了一个小函数来封装它:

          function sortArrayByLength(arr, ascYN) {
                  arr.sort(function (a, b) {           // sort array by length of text
                      if (ascYN) return a.length - b.length;              // ASC -> a - b
                      else return b.length - a.length;                    // DESC -> b - a
                  });
              }
          

          然后只需调用它

          sortArrayByLength( myArray, true );
          

          请注意,不幸的是,函数可以/不应该添加到 Array 原型中,如 this page 中所述。

          此外,它修改了作为参数传递的数组并且不返回任何内容。这将强制阵列的重复,并且对于大型阵列来说不是很好。如果有人有更好的想法,请发表评论!

          【讨论】:

            【解决方案8】:

            我改编了@shareef 的答案以使其简洁。我用,

            .sort(function(arg1, arg2) { return arg1.length - arg2.length })

            【讨论】:

            • 这将从低长度到高长度排序
            【解决方案9】:

            这段代码应该可以解决问题:

            var array = ["ab", "abcdefgh", "abcd"];
            
            array.sort(function(a, b){return b.length - a.length});
            
            console.log(JSON.stringify(array, null, '\t'));
            

            【讨论】:

              【解决方案10】:
              let array = [`ab`, `abcdefgh`, `abcd`];
              let newArray = array.sort((a,b) => {
                  return b.length - a.length
              })
              console.log(newArray);
              

              请输入以下代码

              【讨论】:

                【解决方案11】:
                let arr  = [5,2,100,1,20,3];
                arr.sort((a,b)=>{
                  return a-b 
                })
                
                console.log(arr) //[1, 2, 3, 5, 20, 100]
                

                在返回值上,sort方法将执行交换元素的功能

                return < 0  { i.e -ve number then  a comes before b}
                return > 0  { i.e +ve number then  b comes before a}
                return == 0 { order of a and b remains same }
                

                【讨论】:

                  【解决方案12】:
                  <script>
                           arr = []
                           arr[0] = "ab"
                           arr[1] = "abcdefgh"
                           arr[2] = "sdfds"
                           arr.sort(function(a,b){
                              return a.length<b.length
                           })
                           document.write(arr)
                  
                  </script>
                  

                  您传递给 sort 的匿名函数告诉它如何对给定的数组进行排序。希望这会有所帮助。我知道这很令人困惑,但是您可以通过将函数传递给 sort 函数来告诉它如何对数组的元素进行排序一个参数告诉它做什么

                  【讨论】:

                  • 排序比较函数应该返回什么?这里有一个提示:它不是布尔值。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-10-03
                  • 1970-01-01
                  • 2017-04-02
                  • 1970-01-01
                  • 2015-01-12
                  • 2022-08-15
                  • 1970-01-01
                  相关资源
                  最近更新 更多