我的javascript中有以下功能。它需要两个对象;一个包含模板变量,另一个包含选项:
handlebars(variables, options)
但是,我有两个对象包含模板变量(var1
和var2
)而不是一个(variables
),并希望将它们都传递给把手功能。我该怎么做?
P.s。:我已尝试像handlebars(var1, var2, options)
那样传递它们,但随后把手var2
用于options
对象和错误。
我也试过handlebars([var1,var2], options)
,但这也不起作用。我提到我这是一个完全的菜鸟吗?如何以预期的方式将所有三个对象传递给函数?
答案 0 :(得分:2)
您可能需要制作包含var1
和var2
内容的单个对象。如果它们是普通的旧JavaScript对象并且你有jQuery,那么你可以这样做:
var variables = $.extend({}, var1, var2);
handlebars(variables, options)
答案 1 :(得分:1)
如果函数需要某些参数,则不能将其与其他参数一起使用(它们的数量和类型)。你必须符合它的要求。
如果var1
和var2
是以下对象:
var properties={
prop1: "a",
propr2: "b"
}
var properties2={
prop3: "aa",
prop4: "bb"
}
您可以将它们混合在一个变量中(在此示例中,连接在p1中完成,因此如果两个对象中都存在属性,则保留p2):
function join(p1, p2) {
for (var name in p2) {
if (var1.hasOwnProperty(name)) {
p1[name]=p2[name];
}
}
return p1;
}
答案 2 :(得分:0)
大概你想要做的是让一个对象具有var1
和var2
的所有属性。这不是一个不常见的要求,并且各种Javascript库支持它,例如jQuery' $.extend
或Underscore.js _.extend
。
使用原生Javascript也不是很难,这使您无需为一个简单的功能部分安装繁重的库:
var combined = {},
key;
for (key in var1) {
if (var1.hasOwnProperty(key)) {
combined[key] = var1[key];
}
}
for (key in var2) {
if (var2.hasOwnProperty(key)) {
combined[key] = var2[key];
}
}
然后,您可以拨打handlebars(combined, options)
。
答案 3 :(得分:0)
正如其他人所提到的,extend
函数是此问题的最佳解决方案。
但是,通常您不希望仅为一个函数包含下划线,lodash或jquery
解决方案?你自己写吧。这不难做到
这是一个浅层扩展的例子:
var extend = function () {
// Get array of objects to be used as a source
var sourceObjects = Array.prototype.slice.call(arguments, 1);
// Iterate over all objects sequentially and copy their properties
// over to the target object (the first argument).
// That way the properties are copied over from the left to the right
var result = sourceObjects.reduce(function (target, source) {
for (key in source) {
if (source.hasOwnProperty(key)) {
target[key] = source[key];
}
}
return target;
}, arguments[0]); // the first argument is the target
return result;
}
extend({}, {foo: 'bar', bar: 'foo'}, {foo: 'baz'}, {some: 'more', more: 'data'}, {some: 'less'} )
>> Object {foo: "baz", bar: "foo", some: "less", more: "data"}