[英]Call Javascript function with Object AND array parameters
[英]Call JavaScript Function using object values as parameters
我有一個對象:
var obj = {
foo: 'foo',
bar: 'bar'
};
我有一個功能:
var f = function(bar, foo) {
// Do something with bar and foo
};
有沒有一種方法可以動態地使用對象調用函數,以便obj ['foo']作為'foo'參數傳遞,而obj ['bar']作為'bar'參數傳遞? 注意,我可能不知道鍵和值的實際名稱或函數參數名稱,所提供的只是一個示例,因此f.call(this, obj['bar'], obj['foo']);
不會的
當然,在ES6中
var f = function({bar, foo}) { console.log('foo', foo, 'bar', bar) }; var obj = { foo: '11', bar: '22' }; f(obj)
根據deceze的評論,我設法提出了一個解決方案。 我不確定這有多快,但是可以完成工作。 歡迎改進! 感謝大家的幫助。
我從這個答案中使用了這個功能:
function getParameterNames(fn){
var fstr = fn.toString();
return fstr.match(/\(.*?\)/)[0].replace(/[()]/gi,'').replace(/\s/gi,'').split(',');
}
並做了如下:
var obj = {
foo: 'foo',
bar: 'bar'
};
var f = function(bar, foo) {
// Do something with bar and foo
};
var sortedArgs = [];
getParameterNames(f).forEach(function(item) {
sortedArgs.push(args[item]);
});
f.apply(this, sortedArgs);
您可以檢查提供的參數是否為對象,然后使用解構
var obj = { foo: 'foo', bar: 'bar' }; var f = function(foo, bar) { if(typeof arguments[0] == 'object') var {foo, bar} = arguments[0]; console.log('Foo: ' + foo); console.log('Bar: ' + bar) }; f(obj); f('lorem', 'ipsum');
您可以編寫一個將包裝您的函數並使用新函數的函數,以獲取所需的函數。
function wrapper(fn) { var fnString = fn.toString(); var fnRegex = /\\((.*)\\)/; var params = fnString .match(fnRegex)[1] .replace(/\\s/, '') .split(',') .filter(function(arg) { return arg; }); return function (o) { var args = params .map(function(arg) { return o[arg]; }); return fn.apply(null, args); } } // Example: your function. function yourFunc(foo, bar) { console.log('my foo: ' + foo); console.log('my bar: ' + bar); } // wrap your function and use new function instead. var enhancedFunc = wrapper(yourFunc); enhancedFunc({foo: 1, bar: 2});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.