Làm thế nào để sắp xếp một mảng dựa trên độ dài của mỗi phần tử?


95

Tôi có một mảng như thế này:

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

Sau khi sắp xếp, mảng đầu ra sẽ là:

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

Ý tôi là, tôi muốn theo thứ tự giảm dần độ dài của mỗi phần tử.


1
sortlà khá thẳng về phía trước, bạn đang gặp khó khăn ở đâu?
mu quá ngắn

4
@muistooshort cũng mặc sort () sắp xếp chuỗi alphabeticly, ông đang tìm kiếm các String.Length sắp xếp như có thể thấy trong câu trả lời lựa chọn :)
jave.web

Câu trả lời:


231

Bạn có thể sử dụng Array.sortphương pháp để sắp xếp mảng. Một hàm sắp xếp coi độ dài của chuỗi làm tiêu chí sắp xếp có thể được sử dụng như sau:

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

Lưu ý: sắp xếp ["a", "b", "c"]theo độ dài của chuỗi không được đảm bảo trả về ["a", "b", "c"]. Theo thông số kỹ thuật :

Việc sắp xếp không nhất thiết phải ổn định (nghĩa là, các phần tử so sánh bằng nhau không nhất thiết phải giữ nguyên thứ tự ban đầu của chúng).

Nếu mục tiêu là sắp xếp theo độ dài thì theo thứ tự từ điển, bạn phải chỉ định tiêu chí bổ sung:

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

Tôi muốn nói thêm rằng điều này sắp xếp mảng bằng cách giảm độ dài của các mục.
davidhq

aha nó ở trong bình luận :) lúc đầu không thấy
davidhq 27/02/16

Chỉ để thêm một thông tin. Đoạn mã này sẽ không hoạt động cho tất cả các trường hợp.
Arunkumar Srisailapathi

Thử cho arr = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'k', 'l'], nó sẽ thất bại
Arunkumar Srisailapathi

15
Cách ES6arr.sort((a, b) => b.length - a.length)
Fergal

4

Chúng ta có thể sử dụng phương thức Array.sort để sắp xếp mảng này.

Giải pháp ES5

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

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

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

Đối với thứ tự sắp xếp tăng dần :a.length - b.length

Đối với thứ tự sắp xếp giảm dần :b.length - a.length

Giải pháp ES6

Chú ý: không phải trình duyệt nào cũng có thể hiểu được mã ES6!

Trong ES6, chúng ta có thể sử dụng biểu thức hàm mũi tên .

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

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

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



0

Dựa trên câu trả lời của Salman, tôi đã viết một hàm nhỏ để gói gọn nó:

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

sau đó chỉ cần gọi nó với

sortArrayByLength( myArray, true );

Lưu ý rằng rất tiếc, các hàm có thể / không nên được thêm vào nguyên mẫu Mảng, như được giải thích trên trang này .

Ngoài ra, nó đã sửa đổi mảng được truyền dưới dạng tham số và không trả về bất kỳ thứ gì. Điều này sẽ buộc phải sao chép mảng và sẽ không tốt cho các mảng lớn. Nếu ai đó có một ý tưởng tốt hơn, xin vui lòng bình luận!


0

Tôi đã điều chỉnh câu trả lời của @ shareef để làm cho nó ngắn gọn. Tôi sử dụng,

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


điều này sẽ sắp xếp từ chiều dài thấp theo chiều dài cao hơn
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
Chỉ đăng mã sẽ không giúp ích gì. Cung cấp một mô tả ngắn gọn về những gì mã của bạn làm.
coderpc

-1

Mã này sẽ thực hiện thủ thuật:

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>

Hàm ẩn danh mà bạn truyền vào để sắp xếp sẽ cho nó biết cách sắp xếp mảng đã cho. Hãy gõ vào điều này. nó phải làm gì


5
Hàm so sánh sắp xếp phải trả về là gì? Đây là một gợi ý: nó không phải là boolean.
mu quá ngắn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.