views:

125

answers:

1

I'm trying to sort some xml into different arrays and I'm a bit stuck on how to go about this.

Here is the xml: http://pastebin.ca/1754892

I'm using this xpath expression to get every "series" element that contains at least one "item" child node.

var ceerez = theXML.evaluate( '//series[item]' ,theXML, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );

then I'm iterating over the result and putting the elements in a regular array:

var newArr=[];
for (var m = 0; m < ceerez.snapshotLength; m++){
  newArr.push(ceerez.snapshotItem(m));  
 }

so what I would like to do next is to map and sort the elements in the newArr array into new arrays for each different sort.

I want to have one array that is numerically sorted by the "pub" attribute (as numbers) for each series element.
One array that is sorted alphabetically for each "title" child element's text.
One array that is sorted by date for each "item" child element.

I know how to do this with the sort() method, but I cant figure out how to do it from within the map() method so that I can make it into a new array.

var a2z1 = newArr.map(function(item){   
    item
.sort(function(a,b) { 
    return a.firstElementChild.textContent.toLowerCase().replace(/[^a-z,0-9]/gm, '') < b.firstElementChild.textContent.toLowerCase().replace(/[^a-z,0-9]/gm, '') ? -1 : 1; 
    });
);

(a.firstElementChild) would be the "title" element.

+1  A: 

Make two other copies of the array (or three, if you don't want to use the original) and, using the sort method, sort each array (in place) by the criteria you specified.

Something like:

var copy1 = newArr.slice(0);
var copy2 = newArr.slice(0);
var copy3 = newArr.slice(0);

copy1.sort(function (a, b) {
  // sort logic
});
copy2.sort(function (a, b) {
  // sort logic
});
copy3.sort(function (a, b) {
  // sort logic
});
ntownsend
Thanks, I didn't realise I could use .slice() on an array. I thought map() was the only way to transfer an array to a new array.Cheers.
Yansky