1

here is my array of objects:

var array = [
 {season:  1, episode:  2, notes: "..."},
 {season:  1, episode:  2, notes: "..."},
 {season:  1, episode:  1, notes: "..."},
 {season: -1, episode: -1, notes: "..."},
 {season: -1, episode: -1, notes: "..."},
 {season: -1, episode: -1, notes: "..."},
 {season:  3, episode:  1, notes: "..."},
 {season:  13, episode:  12, notes: "..."},
 {season:  2, episode:  1, notes: "..."},
];

I'd like to sort this array by season so the result must be:

var sorted_array = [
 {season: -1, episode: -1, notes: "..."},
 {season: -1, episode: -1, notes: "..."},
 {season: -1, episode: -1, notes: "..."},
 {season:  1, episode:  1, notes: "..."},
 {season:  1, episode:  2, notes: "..."},
 {season:  1, episode:  2, notes: "..."},
 {season:  2, episode:  1, notes: "..."},
 {season:  3, episode:  1, notes: "..."},
 {season:  13, episode:  12, notes: "..."},
];

and group this array by season and episode so another key must be used and the result must be like this:

var final_array = [

 { "S-1 E-1": [
   {season: -1, episode: -1, notes: "..."},
   {season: -1, episode: -1, notes: "..."},
   {season: -1, episode: -1, notes: "..."},
 ] },
 { "S01 E01": [
   {season:  1, episode:  1, notes: "..."}
 ] },
 { "S01 E02": [
   {season:  1, episode:  2, notes: "..."},
   {season:  1, episode:  2, notes: "..."}
 ] },
 { "S02 E01": [
   {season:  2, episode:  1, notes: "..."}
 ] },
 { "S03 E01": [
   {season:  3, episode:  1, notes: "..."}
 ] },
 { "S13 E12": [
   {season:  13, episode:  12, notes: "..."}
 ] }

];

Any ideas on how to generate an array like final_array from array?

Thanks

james12311
  • 23
  • 3
  • 1
    Do you have a question? – JLRishe Dec 29 '14 at 18:49
  • 1
    It seems like you're trying to sort by `season` first, and then `episode` if the season is the same. [This question](http://stackoverflow.com/questions/6129952/javascript-sort-array-by-two-fields) goes over the same thing, I think. – alex Dec 29 '14 at 18:51
  • Is there a reason the end result is an array of single-property objects instead of one object with several properties? – JLRishe Dec 29 '14 at 18:58

2 Answers2

0

You can use _.groupBy to do the grouping right off the bat:

var grouped = _.groupBy(array, function (el) { 
    var s = el.season,
        e = el.episode;
    return "S" + (s > 0 && s < 10 ? "0" : "") + s +
           " E" + (e > 0 && e < 10 ? "0" : "") + e;
});

This will produce a single object with the grouping values as keys:

{ 
    "S-1 E-1": [
        {season: -1, episode: -1, notes: "..."},
        {season: -1, episode: -1, notes: "..."},
        {season: -1, episode: -1, notes: "..."},
    ],
    "S01 E01": [
        {season:  1, episode:  1, notes: "..."}
    ],
    "S01 E02": [
        {season:  1, episode:  2, notes: "..."},
        {season:  1, episode:  2, notes: "..."}
    ],
    "S02 E01": [
        {season:  2, episode:  1, notes: "..."}
    ],
    "S03 E01": [
        {season:  3, episode:  1, notes: "..."}
    ],
    "S13 E12": [
        {season:  13, episode:  12, notes: "..."}
    ]
}

If you then want to iterate over that in Season/Episode sorted order, you can sort its keys and iterate over those:

_.sortBy(Object.keys(grouped), function (el) { return el; }).forEach(function (key) {
    console.log(key + ":");
    console.log(grouped[key]);
});

http://jsfiddle.net/g370ycmn/

JLRishe
  • 99,490
  • 19
  • 131
  • 169
0

It's very very very ugly, but just to have an idea if you need some parts for the future...DEMO

Input:

 var sArray = [
      {season:  1, episode:  2, notes: "..."},
      {season:  1, episode:  2, notes: "..."},
      {season:  1, episode:  1, notes: "..."},
      {season: -1, episode: -1, notes: "..."},
      {season: -1, episode: -1, notes: "..."},
      {season: -1, episode: -1, notes: "..."},
      {season:  3, episode:  1, notes: "..."},
      {season:  13, episode:  12, notes: "..."},
      {season:  2, episode:  1, notes: "..."},
];

Output:

'S-1 E-1':[{season:-1, episode:-1, notes:"..."}, {season:-1, episode:-1, notes:"..."}, {season:-1, episode:-1, notes:"..."}], 
'S01 E01':[{season:1, episode:1, notes:"..."}], 
'S01 E02':[{season:1, episode:2, notes:"..."}, {season:1, episode:2, notes:"..."}], 
'S02 E01':[{season:2, episode:1, notes:"..."}], 
'S03 E01':[{season:3, episode:1, notes:"..."}], 
'S13 E12':[{season:13, episode:12, notes:"..."}]

Code(from one of the comments):

//Sort array by season and episode keys
//0 means same, 1 means greater and -1 means less
sArray.sort(function (a, b) {
    if (a.season == b.season) {
        return (a.episode < b.episode) ? -1 : (a.episode > b.episode) ? 1 : 0;
    } else {
        return (a.season < b.season) ? -1 : 1;
    }
});

var c = sArray.length,
    sfArray = {};
//Populate object
for (var i = 0; i < c; i++) {
    //Define the key:conact season and episode while checking if the number ∈ [0,9], if true add '0' before
    var key = 'S' + ((sArray[i].season < 10 && sArray[i].season > -1) ? '0' + sArray[i].season : sArray[i].season) +
        ' E' + ((sArray[i].episode < 10 && sArray[i].episode > -1) ? '0' + sArray[i].episode : sArray[i].episode);

    //Check if key exists, otherwise create it as Array
    if (!(key in sfArray)) 
        sfArray[key] = [];

    //Add element to key
    sfArray[key].push(sArray[i]);
}
Razorphyn
  • 1,314
  • 13
  • 37