4

I have two JSON feeds. One contains the basic information about a course, the 2nd contains information that is of a more administrative nature. Here is a sample of what I mean.

FIRST

{"courses":
    {"course":{"id":"4","title":"Using a computer","body":"36"}}
   ,{"course":{"id":"5","title":"Job hunting online","body":"29"}}
}

SECOND

{"courses":
   {"4": {"id":4,"name":"Online Basics","title":"Using a computer","shortname":"onlinebasics","height":640,"width":980,"html5":1,"url":"\/sites\/default\/files\/courses\/onlinebasics\/wrapper.html","started_on":"","bundle_only":true,"progress":false,"completed_on":"2012\/10\/31 00:12:39","on_planner":true}
   ,"5": {"id":5,"name":"Online Basics","title":"OB2 Job hunting online","shortname":"onlinebasics","height":640,"width":980,"html5":1,"url":"\/sites\/default\/files\/courses\/onlinebasics\/wrapper.html","started_on":"","bundle_only":true,"progress":false,"completed_on":"2012\/11\/24 02:14:51","on_planner":false}
   }
}

DESIRED OUTPUT

{"courses":
    {"course":{"id":"4","title":"Using a computer","body":"36","name":"Online Basics","title":"Using a computer","shortname":"onlinebasics","height":640,"width":980,"html5":1,"url":"\/sites\/default\/files\/courses\/onlinebasics\/wrapper.html","started_on":"","bundle_only":true,"progress":false,"completed_on":"2012\/10\/31 00:12:39","on_planner":true}}
}

I hope the addition of a "desired output" option will make it easier to understand. Even though I have only put 1 example into the desired output area, I want all records where the id's match to merge.

Any suggestions?

Thanks.

Phil James
  • 113
  • 1
  • 10
  • I tried using JQuery .extend but that was of no use to me at all... what I am trying to achieve is a merging of the record from the course details feed with the record from the administrative feed where the id number match and then have that output to a third new element. – Phil James Feb 26 '13 at 14:46
  • What have you tried? - [First post](http://stackoverflow.com/questions/3857152/jquery-merge-multiple-json-results) - [Second post](http://stackoverflow.com/questions/8478260/merge-two-json-objects-with-jquery) - [Third post](http://stackoverflow.com/questions/10384845/merge-two-json-objects-in-to-one-object) If neither of these are helpful, why? What makes your problem different from others? – Michal Feb 26 '13 at 14:31
  • First post is just about merging two identical feeds together... – Phil James Feb 26 '13 at 14:36
  • Second post I don't know what its about as the data samples cannot be accessed anymore – Phil James Feb 26 '13 at 14:37
  • Third post again is about merging two objects into one... – Phil James Feb 26 '13 at 14:38
  • What I want to do is to combine the JSON elements into one element if their id numbers match. I DO NOT want to just add the two JSON feeds into one long feed... And by JSON element, I mean one record. – Phil James Feb 26 '13 at 14:39
  • Could you show us expected merged object? How do you exactly want the new object to look like? The first consists of array, second of many nested objects. I can't really tell what do you want it to be like. – Michal Feb 26 '13 at 14:48

1 Answers1

7
$.when($.get("feed1.json"), $.get("feed2.json")).done(function(basics, admin) {
    var basiccourses = basics[0].courses,
        admincourses = admins[0].courses;
    // merge all basic course objects into the admin courses object
    for (var i=0; i<basiccourses.length; i++) {
        var basic = basiccourses[i];
        if (basic.id in admincourses)
            // by extending the course object
            $.extend(admincourses[basic.id], basic);
        else
            // or just copying it over
            admincourses[basic.id] = basic;
    }

    // now admincourses has all information combined
});
Bergi
  • 630,263
  • 148
  • 957
  • 1,375
  • @JanDvorak: Yes, thanks. I'm never sure how [`$.when`](http://api.jquery.com/jQuery.when/) combines the arguments – Bergi Feb 26 '13 at 14:54
  • 3
    nice codeblock but without explanation not really helpful. You are improving the OPs copy&paste skills, not his technical skills... – Christoph Feb 26 '13 at 14:59