143

I have an array like this:

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

After sorting, the output array should be:

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

I want in the descending order of the length of each element.

1
  • 6
    @muistooshort well default sort() sorts strings alphabeticly, he was looking for the string.length sorting as can be seen in the chosen answer :) Commented Aug 7, 2013 at 16:02

12 Answers 12

319

You can use Array.sort method to sort the array. The callback function should use the length of item as the sorting criteria:

// sort ascending - shorter items first
arr.sort((a, b) => a.length - b.length);

// sort descending - longer items first
arr.sort((a, b) => b.length - a.length);

You can specify additional criteria if length of two items are same:

// sort by length
// if equal then sort by dictionary order
["c", "a", "b"].sort((a, b) => a.length - b.length || a.localeCompare(b));
Sign up to request clarification or add additional context in comments.

5 Comments

@ArunKumar what is the expected output?
@ArunKumar I have revised the answer. The sort function is allowed to rearrange two elements if they are considered "equal".
The ES6 way arr.sort((a, b) => b.length - a.length)
this works very well for me, just what i was in search of.
@Fergal I think it's unfair to call that "the ES6 way"... might confuse some newer people. For instance if the logic of the function required a block then you need the explicit return statement.
13

We can use Array.sort method to sort this array.

ES5 solution

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

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

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

For ascending sort order: a.length - b.length

For descending sort order: b.length - a.length

ES6 solution

Attention: not all browsers can understand ES6 code!

In ES6 we can use an arrow function expressions.

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

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

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

Comments

5

With modern JavaScript you can do like this:

Descending order

const arr = [
  "ab",
  "abcdefgh",
  "abcd",
  "abcdefghijklm"
];

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

console.log(JSON.stringify(arr, null, 2));

Ascending Order - Just switch the a with b

const arr = [
  "ab",
  "abcdefgh",
  "abcd",
  "abcdefghijklm"
];

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

console.log(JSON.stringify(arr, null, 2));

Comments

3

Here is the sort, depending on the length of a string with javascript using Bubble sort as you asked:

var arr = ['1234', '12', '12345', '1'];

bubbleSort(arr );

function bubbleSort(a) {
    var swapped;
    do {
        swapped = false;
        for (var i = 0; i < a.length - 1; i++) {
            if (a[i].length < a[i + 1].length) {
                var temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
                swapped = true;
            }
        }
    } while (swapped);
}

console.log(arr );

Comments

1
#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 Comment

Posting the code alone won't help. Give a brief description of what your code does.
1

If you want to preserve the order of the element with the same length as the original array, use bubble sort.

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

Output  = ["ab","cd","cdc","abcd"]

Function:

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

Comments

1
let arr  = [5,2,100,1,20,3];
arr.sort((a,b)=>{
  return a-b 
})

console.log(arr) //[1, 2, 3, 5, 20, 100]

on the return value, the sort method will perform the functionality of swapping of an elements

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 }

Comments

0

Based on Salman's answer, I've written a small function to encapsulate it:

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

then just call it with

sortArrayByLength( myArray, true );

Note that unfortunately, functions can/should not be added to the Array prototype, as explained on this page.

Also, it modified the array passed as a parameter and doesn't return anything. This would force the duplication of the array and wouldn't be great for large arrays. If someone has a better idea, please do comment!

Comments

0

I adapted @shareef's answer to make it concise. I use,

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

1 Comment

this would sort from low length to higher length
0

This code should do the trick:

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

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

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

Comments

0
let array = [`ab`, `abcdefgh`, `abcd`];
let newArray = array.sort((a,b) => {
    return b.length - a.length
})
console.log(newArray);

Please the following code

Comments

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

The anonymous function that you pass to sort tells it how to sort the given array.hope this helps.I know this is confusing but you can tell the sort function how to sort the elements of the array by passing it a function as a parameter telling it what to do

1 Comment

What is the sorting comparison function supposed to return? Here's a hint: it isn't a boolean.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.