簡體   English   中英

將函數參數傳遞給Object.assign

[英]Pass function arguments to Object.assign

假設我有一個函數從其他對象組成一個對象,我將參數傳遞給函數 - 最初是一個對象文字,然后是我想要組合的對象來擴展對象:

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

傳遞的args數是可選的,我如何從第二個arg開始將args傳遞給Object.assign() 所以該函數類似於以下內容:

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

提前致謝 :)

如果您使用的是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的回答 ,因為這是在ES2015中執行此操作的正確方法。

如果你沒有使用ES2015,你可以通過apply僅使用填充的Object.assign做同樣的事情:

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

在那里,我們使用Function#apply而不是spread運算符(因為ES5和更早版本沒有spread運算符)。 Function#apply調用你怎么稱呼它使用的第一個參數的函數this在通話過程中,並使用陣列(或陣列狀的東西),你給它的第二個參數作為參數呼叫。

所以說你有:

obj.foo.apply(obj, [1, 2, 3]);

使用Function#apply的等價物是:

 obj.foo.apply(obj, [1, 2, 3]); 

第一個參數, obj ,告訴apply如使用什么this在通話過程中。 第二個參數是要使用的參數數組。

但是如果你使用擴展運算符,則沒有必要,它將類似數組的操作數擴展為離散參數。

ES2015:

function composeObj(objs, ...rest){
  return Object.assign(...rest);
}

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將不再由JS編譯器進行優化。 所以,不要這樣做。

關於TJ Crowders Answer和評論已經說了其他一切; 只是展示更好的實施。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM