将函数参数传递给Object.assign

时间:2016-04-16 10:07:58

标签: javascript

假设我有一个函数从其他对象组成一个对象,我将参数传递给函数 - 最初是一个对象文字,然后是我想要组成的对象来扩展对象:

composeFunc({}, obj1, obj2, obj3);

传递的args数是可选的,我如何从第2个arg开始将args传递给Object.assign()。因此该函数类似于以下内容:

function composeObj(objs) {
    return Object.assign(arguments[1], arguments[2], arguments[3]... etc);
}

提前致谢:)

2 个答案:

答案 0 :(得分:5)

如果您使用的是ES2015而不仅仅是垫片,则可以使用扩展符号,Array.fromslice

function composeObj(objs) {
    return Object.assign(...Array.from(arguments).slice(1));
}

或者直接使用slice而不是Array.from之后:

function composeObj(objs) {
    return Object.assign(...Array.prototype.slice.call(arguments, 1));
}

...使用rest args查看Thomas' answer,因为这是在ES2015中执行此操作的正确方法。

如果您不使用ES2015,只需使用Object.assign applyfunction composeObj(objs) { return Object.assign.apply(Object, Array.prototype.slice.call(arguments, 1)); } ,您就可以做同样的事情:

Function#apply

在那里,我们使用Function#apply而不是扩展运算符(因为ES5和更早版本没有扩展运算符)。 this在调用期间使用第一个参数obj.foo(1, 2, 3); 调用您调用它的函数,并使用数组(或类似数组的东西)将其作为第二个参数作为调用的参数

所以说你有:

Function#apply

使用obj.foo.apply(obj, [1, 2, 3]); 的等价物是:

obj

第一个参数apply告诉this在通话过程中使用SELECT DISTINCT P_Id FROM Room WHERE NOT EXISTS (SELECT P_Id FROM Room WHERE room <>'B'); 的内容。第二个参数是要使用的参数数组。

但是如果使用扩展运算符,则没有必要,它将类似数组的操作数展开为离散参数。

答案 1 :(得分:3)

ES2015:

rest

function composeObj(objs) { for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { rest[_key - 1] = arguments[_key]; } return Object.assign.apply(Object, rest); } 将是从第二个开始的所有参数的真实数组。

巴别塔输出:

arguments

这似乎是一个可以在整个地方使用的实用功能。只要您将Array.prototype.slice()传递给Array.from()composeObj之类的其他函数,{{1}}就不会再被JS编译器优化。所以,不要这样做。

其他一切都已在T.J.上说过。克劳斯回答和评论;只是展示更好的实施。