如何根据每个元素的长度对数组排序?


95

我有一个像这样的数组:

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

排序后,输出数组应为:

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

我的意思是,我想按每个元素长度的降序排列。


1
sort很简单,您在哪里遇到困难?
亩太短

4
@muistooshort好default默认sort()按字母顺序对字符串进行排序,他正在寻找string.length,如在所选答案中可以看到的那样:)
jave.web 2013年

Answers:


231

您可以使用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"]。根据规格

排序不一定是稳定的(也就是说,比较相等的元素不一定保持其原始顺序)。

如果目标是按长度排序,然后按字典顺序排序,则必须指定其他条件:

["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
});

我要补充一点,它通过减少项目的长度来对数组进行排序。
davidhq '16

啊哈,它在评论中:)起初没有看到它
davidhq

仅添加信息。此代码段不适用于所有情况。
Arunkumar Srisailapathi 2016年

尝试使用arr = ['a','b','c','d','e','f','g','h','i','k','l'],它会失败
Arunkumar Srisailapathi

15
ES6方式arr.sort((a, b) => b.length - a.length)
Fergal

4

我们可以使用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中,我们可以使用箭头函数表达式

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

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

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



0

基于Salman的答案,我编写了一个小函数来封装它:

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原型中,如本页所述

此外,它修改了作为参数传递的数组,并且不返回任何内容。这将强制复制数组,并且对大型数组而言效果不佳。如果有人有更好的主意,请发表评论!


0

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

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


从低到高的长度排序
Miguel

0
#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

1
单独发布代码无济于事。简要说明您的代码的作用。
coderpc

-1

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

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

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

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

-3
<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函数如何对数组的元素进行排序它该怎么办


5
排序比较函数应该返回什么?这是一个提示:它不是布尔值。
亩太短,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.