Ghoul Fool
Ghoul Fool

Reputation: 6949

Order elements from string

I've got a string!

It's made up of number + [space] + thing-string. I need to be able to order the whole string with reference to the number. So it should come out:

It's a simple bubble sort for the number and then cross-referencing the index to get the final order. The JavaScript code below works, but I can't help but think it could be made more efficient. Am I missing a trick here??

And remember: I'm an artist, so I code in crayon!

var eventsStr = "7 serpents\n4 bikes\n2 mangoes"
var splitArr = eventsStr.split("\n")
var numArray = new Array();
var events = new Array();

for (var i = 0; i < splitArr.length; i++)
{
  var temp = splitArr[i] ;
  var part1 = temp.substring(0, temp.indexOf(" "))
  var part2 = temp.substring(temp.indexOf(" ")+1, temp.length)
  numArray[i] = part1;
  events[i] = part2;
}

var sorted = superCopy(numArray);
var sorted = sorted.sort(sortArrayNumerically);
alert(getOrder(sorted, numArray, events))


function getOrder(orderedarr, arr1, arr2)
{
  var str = "";
  for (var i = 0; i < arr1.length; i++)
  {
    for (var j = 0; j < orderedarr.length; j++)
    {
      if (arr1[i] == orderedarr[j]) 
      {
        // found the thing !what is the event?
        str += arr1[i] + " " + arr2[i] + "\n";
      }
    }
  }
  return str
}

function sortArrayNumerically(a,b)
{
    return a - b;
}

function superCopy(arr)
{
  tempArr = new Array();
  for (var i = 0; i < arr.length; i++)
  {
    tempArr[i] = arr[i]
  }
  return tempArr
}

Upvotes: 0

Views: 75

Answers (2)

rid
rid

Reputation: 63442

You could use JavaScript's sort() function:

eventsStr.split('\n').sort().join('\n');

  • eventsStr.split('\n') - first split the string on the newline character to create an array
  • .sort() - then use the sort() function to sort the array
  • .join('\n') - then put the string back together, joining the array elements with a newline between them

Reference:


This is an alphabetic sort though, so if your string contained, say, 12 mangoes, the result would not be sorted numerically. To sort numerically, you could do something like this:

eventsStr.split('\n').sort(function(a, b) {
    return parseInt(a.split(' ')[0], 10) > parseInt(b.split(' ')[0], 10);
}).join('\n');

In this situation, the sort() function is called with a callback parameter, taking 2 values: the first string to be compared and the second string to be compared. This callback function then splits the string, extracts the number and compares it with the number in the other string.

Upvotes: 2

Dhanu Gurung
Dhanu Gurung

Reputation: 8840

Use

splitArr.sort()   // as per your code

DEMO

var eventsStr = "7 serpents\n4 bikes\n2 mangoes"
arr = eventsStr.split('\n')
# ["7 serpents", "4 bikes", "2 mangoes"]
arr
# ["7 serpents", "4 bikes", "2 mangoes"]
arr.sort()
# ["2 mangoes", "4 bikes", "7 serpents"]

Upvotes: 0

Related Questions