假设我有一个函数从其他对象组成一个对象,我将参数传递给函数 - 最初是一个对象文字,然后是我想要组成的对象来扩展对象:
composeFunc({}, obj1, obj2, obj3);
传递的args数是可选的,我如何从第2个arg开始将args传递给Object.assign()
。因此该函数类似于以下内容:
function composeObj(objs) {
return Object.assign(arguments[1], arguments[2], arguments[3]... etc);
}
提前致谢:)
答案 0 :(得分:5)
如果您使用的是ES2015而不仅仅是垫片,则可以使用扩展符号, Array.from
和slice
:
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
apply
来function 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.上说过。克劳斯回答和评论;只是展示更好的实施。