0

I have a list of elements in an array in Javascript as follows:

myArray = ["Datastore one - free space 34.23GB", "Datastore two - free space 56.23GB",...]

and so on. I would like to sort the array on the freespace, so in the example above Datastore two would be the first element in the array. The array is always constructed with "- free space xx.xxGB", but the free space could be 5 digits in some cases, so xxx.xxGB for example.

Can anyone help provide a way of sorting the array please? I see I can use something like

"*- free space\s[1-9][0-9]*GB"

So would this be like

myArray.sort("*- free space\s[1-9][0-9]*GB") ?

Is this correct or how would I do this? Many thanks in advance.

3 Answers 3

2

Pull the numeric parts out in a custom sort function, and subtract:

myArray = ["Datastore one - free space 34.23GB", "Datastore two - free space 56.23GB", "Datastore three - free space 6.23GB" ];

var re = /([0-9\.]+)GB/;  // regex to retrieve the GB values

myArray = myArray.sort(
    function(a, b) {
      var ma = a.match(re);  // grab GB value from each string
      var mb = b.match(re);   // the result is an array, with the number at pos [1]
      
      return (ma[1] - mb[1]);  
    }
  );

alert(myArray.join("\r\n"));

Sign up to request clarification or add additional context in comments.

1 Comment

This is better: var re = /free space (\d+(?:\.\d+|))/
1

This should do the trick:

myArray.sort(function compare(a, b) {
  var size1 = parseFloat(a.replace(/[^0-9\.]/g, ''));
  var size2 = parseFloat(b.replace(/[^0-9\.]/g, ''));
  if (size1 < size2) {
    return -1;
  } else if (size1 > size2) {
    return 1;
  }
  return 0;
});

Array.prototype.sort does not accept a regex, it accepts a callback or will do its best to sort your array based on numeric/alphabetical order if you don't pass a callback

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

3 Comments

What about return size1 - size2
Sure, that works fine and is more succinct, but seeing as the asker was showing an incomplete knowledge of the sort function I figured I'd be verbose.
Thank you! That definitely helps me.
1

This should work as well if you just want the numbers returned.

I split the string by spaces and grab the last section. (#GB), I then grab the substring of everything but the last two characters (so I chop off the GB), I then use the Javascript function to sort the remaining numbers.

JSFiddle Demo

window.onload = function() {
   myArray = ["Datastore one - free space 34.23GB", "Datastore two - free space 56.23GB", "Datastore two - free space 16.23GB", "Datastore two - free space 6.23GB"];
    for (i = 0; i < myArray.length; i++) 
    { 
      var output  = myArray[i].split(" ").pop(); 
      output = output.substring(0, output.length-2);
      myArray[i] = output;
    }
   myArray.sort(function(a, b){return a-b});
   alert(myArray);
};

Comments

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.