43

I have a function called "Colorbox" (jQuery plugin) that takes a number of parameters like so:

$(this).colorbox({ width : "500px", height : "500px" }); 

I have several different types of "this", though, each with their own properties. Like so:

var Type = { video: { width : "500px", height : "500px" }, gallery: { width : "1065px", height : "600px" } } 

Beyond that, I have other behaviors, logic, and a 'default' group of settings (which get overwritten by more specific ones). What I'm trying to do is push all the appropriate settings, from multiple objects, into a single Object so I can just call:

$(this).colorbox(Settings); 

How would I transfer an unknown group of properties and their values (for example "width" and "height") from something like Type.video into Settings? The goal is to be able to call Settings.height and get back the value I pushed in.

2

7 Answers 7

82

Take a look at the JQuery extend method. It can merge two objects together and all their properties.

From JQuery's example page:

var settings = { validate: false, limit: 5, name: "foo" }; var options = { validate: true, name: "bar" }; jQuery.extend(settings, options); 

Now settings contains the merged settings and options objects.

3
  • This looks perfect! I guess I thought there would be a built-in javascript method for this, but Extend seems to do exactly what I need. Thanks!CommentedAug 26, 2009 at 13:35
  • This seems useful to the OP but technically it's not what the question asks for. The OP didn't mentioned he wanted to use jQuery for that... Just plain JavaScript.CommentedJul 30, 2012 at 21:31
  • 8
    The OP is writing a jQuery plugin sp it would seem silly to give a more complicated solution when it would make most sense to use a jQuery function inside of a jQuery plugin.CommentedJul 30, 2012 at 22:58
13

JavaScript have a simple native function to merge object. which is Object.assign() introduced in ES6.

 // creating two JavaScript objects var x = { a: true };var y = { b: false}; // merging two objects with JavaScript native function var obj = Object.assign(x,y); //result Console.log(obj); // output is { a: true, b: false } 

for more information about javascript merging object please check at merge JavaScript objects with examples.

3
  • Upvoted. I had to upgrade node, because of the "undefined is not a function" error - even when running node with the --harmony flag...CommentedOct 14, 2015 at 17:04
  • This does not work with nested layers in objects, it only works at the top level
    – user2932053
    CommentedDec 19, 2016 at 17:26
  • For the sake of completeness: The target of the merge is the first argument to Object.assign, ie. x in the sample code is mutated. See here(MDN) for details.
    – collapsar
    CommentedApr 3, 2018 at 14:21
12

A non-jQuery solution is:

YOUROBJ.vars = { vars1: { vars1_1: 'an object which will overwrite', vars1_2: 'an object which will be added' } }; YOUROBJ.vars2 = (!YOUROBJ.vars) ? {} : YOUROBJ.vars; YOUROBJ.vars = { vars1: { vars1_1: 'an object which will be overwritten', vars1_3: 'an object which will remain' } }; YOUROBJ.extend = function(obj, defaults) { for (var i in defaults) { if (!obj[i]) { obj[i] = defaults[i]; } else { YOUROBJ.extend(obj[i], defaults[i]); } } }; YOUROBJ.extend(YOUROBJ.vars, YOUROBJ.vars2); delete YOUROBJ.vars2; 

This is useful if you wish to add a variable to a general functions object before it has been loaded and created.

This also enables the second YOUROBJ.vars to act as the default setting,.

3
  • 4
    What does "FC" refer to?CommentedNov 15, 2013 at 12:42
  • My guess is they actually are using this code in their code base calling it FC, and changed it to YOUROBJ to answer the question and just missed a spot.
    – John Gibb
    CommentedOct 14, 2014 at 13:48
  • Correct. Updated the solution.
    – mummybot
    CommentedMay 22, 2015 at 12:46
6

If you're using jQuery you should checkout the $.extend function.

You could try something like this:

$.fn.somePlugin = function(options){ settings = $.extend(true, {default_values: "foo"}, options); } 
    4

    I have also created a "merge" function in Javascript to use for my general purposes:

    if (typeof Object.merge !== 'function') { Object.merge = function (o1, o2) { // Function to merge all of the properties from one object into another for(var i in o2) { o1[i] = o2[i]; } return o1; }; } 

    Usage:

    var eDiv = document.createElement("div"); var eHeader = Object.merge(eDiv.cloneNode(false), {className: "header", onclick: function(){ alert("Click!"); }}); 

    It's quicker and dirtier (shallow copy), but it does what I need it to do.

    2
    • Warning: extending the Object prototype like that is unadvisable and generally dangerous. Pretty good writeup on the dangers of this and when/how you can get away with it here sugarjs.com/native and a great talk on the subject here blip.tv/jsconf/…
      – timoxley
      CommentedJul 31, 2012 at 17:24
    • 3
      @timoxley: If you look closely, it isn't actually modifying the Object prototype.
      – palswim
      CommentedJul 31, 2012 at 17:58
    3

    I don't understand your question very well but i think you should use the $.extend function:

    Settings=$.extend(Settings, Type.video); 

    in this way Settings will get Type.video properties

    1
    • Fair enough about the question. Thanks for the example, this is perfect.CommentedAug 26, 2009 at 13:36
    1

    Simply first level merging (appending keys from second object to first one):

    var mergeObjects = function (originalObject, objectToAppend) { for (var item in objectToAppend) { if (objectToAppend.hasOwnProperty(item)) { originalObject[item] = objectToAppend[item]; } } }; 

    originalObject must be non-null!

    4
    • In what case would hasOwnProperty trigger a false result in the check? Is there additional items that the foreach loop will extract out of the object?
      – Prusprus
      CommentedJul 10, 2014 at 15:02
    • 1
    • That's a good reference, thanks for that. So I guess I'm a little confused as to how an array (say in the example given thru your URL) can have inherited properties, if it's just an array?
      – Prusprus
      CommentedJul 10, 2014 at 17:35
    • 1
      @Prusprus Every array inherits properties added to Array.prototype: "Array instances inherit from Array.prototype. As with all constructors, you can change the constructor's prototype object to make changes to all Array instances."
      – user11153
      CommentedJul 10, 2014 at 17:45

    Start asking to get answers

    Find the answer to your question by asking.

    Ask question

    Explore related questions

    See similar questions with these tags.