如何将三个对象传递给只需要两个的函数?

时间:2014-05-29 08:45:53

标签: javascript function object handlebars.js gulp

我的javascript中有以下功能。它需要两个对象;一个包含模板变量,另一个包含选项:

handlebars(variables, options)

但是,我有两个对象包含模板变量(var1var2)而不是一个(variables),并希望将它们都传递给把手功能。我该怎么做?


P.s。:我已尝试像handlebars(var1, var2, options)那样传递它们,但随后把手var2用于options对象和错误。

我也试过handlebars([var1,var2], options),但这也不起作用。我提到我这是一个完全的菜鸟吗?如何以预期的方式将所有三个对象传递给函数?

4 个答案:

答案 0 :(得分:2)

您可能需要制作包含var1var2内容的单个对象。如果它们是普通的旧JavaScript对象并且你有jQuery,那么你可以这样做:

var variables = $.extend({}, var1, var2);
handlebars(variables, options)

答案 1 :(得分:1)

如果函数需要某些参数,则不能将其与其他参数一起使用(它们的数量和类型)。你必须符合它的要求。

如果var1var2是以下对象:

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)

大概你想要做的是让一个对象具有var1var2的所有属性。这不是一个不常见的要求,并且各种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"}