จะเรียงอาร์เรย์ตามความยาวของแต่ละองค์ประกอบได้อย่างไร?


100

ฉันมีอาร์เรย์ดังนี้:

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

หลังจากการเรียงลำดับอาร์เรย์เอาต์พุตควรเป็น:

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

ฉันหมายถึงฉันต้องการเรียงลำดับจากมากไปหาน้อยของความยาวของแต่ละองค์ประกอบ


2
sortค่อนข้างตรงไปตรงมาคุณมีปัญหาตรงไหน?
สั้นเกินไป

5
@muistooshort well default sort () เรียงลำดับสตริงตามตัวอักษรเขากำลังมองหา string.length การเรียงลำดับตามที่เห็นในคำตอบที่เลือก :)
jave.web

คำตอบ:


242

คุณสามารถใช้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

aha มันอยู่ในความคิดเห็น :) ตอนแรกไม่เห็น
davidhq

เพียงเพื่อเพิ่มข้อมูล ตัวอย่างข้อมูลนี้ใช้ไม่ได้กับทุกกรณี
อรุณกุมารศรีศิลาพาที

ลองหา arr = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'k', 'l'], มันจะล้มเหลว
อรุณกุมารศรีศิลาพาที

18
ทาง ES6arr.sort((a, b) => b.length - a.length)
Fergal

5

เราสามารถใช้เมธอด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 })


สิ่งนี้จะเรียงลำดับจากความยาวต่ำไปสู่ความยาวที่สูงขึ้น
มิเกล

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

0

หากคุณต้องการรักษาลำดับขององค์ประกอบที่มีความยาวเท่ากับอาร์เรย์เดิมให้ใช้การจัดเรียงแบบฟอง

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

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

ฟังก์ชันที่ไม่ระบุตัวตนที่คุณส่งไปเพื่อเรียงลำดับจะบอกวิธีการจัดเรียงอาร์เรย์ที่กำหนดหวังว่าจะช่วยได้ฉันรู้ว่าสิ่งนี้สับสน แต่คุณสามารถบอกฟังก์ชันการจัดเรียงว่าจะเรียงลำดับองค์ประกอบของอาร์เรย์ได้อย่างไรโดยส่งผ่านฟังก์ชันเป็นพารามิเตอร์บอก มันจะทำอย่างไร


5
ฟังก์ชันเปรียบเทียบการเรียงลำดับควรจะส่งคืนอะไร นี่คือคำแนะนำ: ไม่ใช่บูลีน
สั้นเกินไป
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.