Mul peab olema võimalik ühendada kaks (väga lihtsat) JavaScripti objekti töö ajal. Näiteks ma tahaksin:
var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }
obj1.merge(obj2);
//obj1 now has three properties: food, car, and animal
Kas kellelgi on selleks mingi skript või teab mingit sisseehitatud võimalust? Mul ei ole vaja rekursiooni ja ma ei pea funktsioone ühendama, vaid lihtsalt meetodeid lamedatel objektidel.
ECMAScript 2018 standardmeetod
Sa kasutaksid objekti levik:
let merged = {...obj1, ...obj2};
/** There's no limit to the number of objects you can merge.
* Later properties overwrite earlier properties with the same name. */
const allRules = {...obj1, ...obj2, ...obj3};
Siin on ka MDN dokumentatsioon selle süntaksi jaoks, ja kui te kasutate babel'i, siis vajate see pluginat, et see töötaks.
ECMAScript 2015 (ES6) standardmeetod
/* For the case in question, you would do: */
Object.assign(obj1, obj2);
/** There's no limit to the number of objects you can merge.
* All objects get merged into the first object.
* Only the object in the first argument is mutated and returned.
* Later properties overwrite earlier properties with the same name. */
const allRules = Object.assign({}, obj1, obj2, obj3, etc);
Metoodika ES5 ja varasemate versioonide jaoks
for (var attrname in obj2) { obj1[attrname] = obj2[attrname]; }
Pange tähele, et see lihtsalt lisab obj2
kõik atribuudid obj1
le, mis ei pruugi olla see, mida te soovite, kui soovite endiselt kasutada muutmata obj1
t.
Kui te kasutate raamistikku, mis teie prototüüpide üle paskab, siis peate te kasutama kontrollide nagu hasOwnProperty
, kuid see kood töötab 99% juhtudest.
Näidisfunktsioon:
/**
* Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1
* @param obj1
* @param obj2
* @returns obj3 a new object based on obj1 and obj2
*/
function merge_options(obj1,obj2){
var obj3 = {};
for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }
for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }
return obj3;
}
jQuery'l on ka selleks abimees: http://api.jquery.com/jQuery.extend/.
Võetud jQuery dokumentatsioonist:
// Merge options object into settings object
var settings = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };
jQuery.extend(settings, options);
// Now the content of settings object is the following:
// { validate: true, limit: 5, name: "bar" }
Ülaltoodud kood muudab olemasolevat objekti nimega settings
.
Kui soovite luua uue objekti ilma kummagi argumendi muutmiseta, kasutage seda:
var defaults = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };
/* Merge defaults and options, without modifying defaults */
var settings = $.extend({}, defaults, options);
// The content of settings variable is now the following:
// {validate: true, limit: 5, name: "bar"}
// The 'defaults' and 'options' variables remained the same.
Prototüüp on see:
Object.extend = function(destination,source) {
for (var property in source)
destination[property] = source[property];
return destination;
}
obj1.extend(obj2)
teeb seda, mida sa tahad.