Javascript 应用对象';函数参数的属性

Javascript 应用对象';函数参数的属性,javascript,ecmascript-6,Javascript,Ecmascript 6,假设我有一个函数(可能来自第三方库,假设我无法更改其定义),以及一个属性与函数参数匹配或重叠的对象: function fn(foo, bar, baz) { /* do stuff */ } var obj = { foo: "yes", bar: 7, baz: false } 有没有一种方法可以将objects属性应用为函数参数,使用某种解构或扩展赋值,或者其他ES6功能,或者我必须单独指定每个参数 fn(...obj); // Doesn't work fn(obj

假设我有一个函数(可能来自第三方库,假设我无法更改其定义),以及一个属性与函数参数匹配或重叠的对象:

function fn(foo, bar, baz) { /* do stuff */ }
var obj = { foo: "yes", bar: 7, baz: false }
有没有一种方法可以将objects属性应用为函数参数,使用某种解构或扩展赋值,或者其他ES6功能,或者我必须单独指定每个参数

fn(...obj); // Doesn't work
fn(obj.foo, obj.bar, obj.baz); // Convoluted but works
fn.apply(null, obj.values()); // Might work if you're lucky
您应该在函数中指定键对象对

const fn=(opts)=>{
const{foo,bar,baz}=opts;//函数的“参数”
log({foo,bar,baz});
}
const obj={PI:Math.PI,bar:7,baz:false,foo:“yes”};
fn(obj)您应该在函数中指定键对象对

const fn=(opts)=>{
const{foo,bar,baz}=opts;//函数的“参数”
log({foo,bar,baz});
}
const obj={PI:Math.PI,bar:7,baz:false,foo:“yes”};

fn(obj)这是一个丑陋的攻击,应该避免,但它确实有效(即使对象的值与参数的顺序不同)

const STRIP\u COMMENTS=/(\/\/.$)|(\/\*[\s\s]*?\*/)/mg;
常量参数名称=/([^\s,]+)/g;
函数getParamNames(func){
const fnStr=func.toString().replace(带注释“”);
让result=fnStr.slice(fnStr.indexOf('(')+1,fnStr.indexOf(')).match(参数名称);
如果(结果===null)
结果=[];
返回结果;
}
功能fn(foo、bar、baz){
返回{foo,bar,baz};
}
const obj={foo:“是”,baz:false,bar:7};
const result=fn(…getParamNames(fn).map(name=>obj[name]);

控制台日志(结果)这是一个丑陋的攻击,应该避免,但它确实有效(即使对象的值与参数的顺序不同)

const STRIP\u COMMENTS=/(\/\/.$)|(\/\*[\s\s]*?\*/)/mg;
常量参数名称=/([^\s,]+)/g;
函数getParamNames(func){
const fnStr=func.toString().replace(带注释“”);
让result=fnStr.slice(fnStr.indexOf('(')+1,fnStr.indexOf(')).match(参数名称);
如果(结果===null)
结果=[];
返回结果;
}
功能fn(foo、bar、baz){
返回{foo,bar,baz};
}
const obj={foo:“是”,baz:false,bar:7};
const result=fn(…getParamNames(fn).map(name=>obj[name]);

控制台日志(结果)您可以为
fn
创建包装函数:

const myFn = ({foo, bar, baz}) => fn(foo, bar, baz);
然后您的通话简化为:

myFn(obj);

您可以为
fn
创建包装函数:

const myFn = ({foo, bar, baz}) => fn(foo, bar, baz);
然后您的通话简化为:

myFn(obj);

“或者说,我必须把每一个参数都单独地指定出来吗?”。这涉及到检查函数的字符串表示,但是。。。好吧,这很难理解。
fn.apply(null,Object.values(obj))
工作正常。记住,重要的是参数的顺序,而不是名称。@evolutionxbox取决于对象的属性顺序,这似乎是一件非常危险的事情。@FelixKling这是一个很酷的解决方案,但确实非常老套:)你必须问问自己,你是否打算充分利用它来证明拥有它的合理性。对任何不熟悉函数参数名称的人来说,查找函数参数名称的黑客行为都是神秘的。那么,你真的想在代码库中看到这样的东西吗?它总共能为您节省多少行代码?手动传递参数可能更好,因为这样会让读者更清楚地了解到底发生了什么。”或者说,我是否坚持将每个参数单独指定“差不多”。这涉及到检查函数的字符串表示,但是。。。好吧,这很难理解。
fn.apply(null,Object.values(obj))
工作正常。记住,重要的是参数的顺序,而不是名称。@evolutionxbox取决于对象的属性顺序,这似乎是一件非常危险的事情。@FelixKling这是一个很酷的解决方案,但确实非常老套:)你必须问问自己,你是否打算充分利用它来证明拥有它的合理性。对任何不熟悉函数参数名称的人来说,查找函数参数名称的黑客行为都是神秘的。那么,你真的想在代码库中看到这样的东西吗?它总共能为您节省多少行代码?手动传递参数可能更好,因为这样会让读者更清楚发生了什么。这只在对象属性和函数参数的顺序匹配时起作用,通常情况并非如此。@wensveen您想要什么?如果我可以更改函数的定义,这将是正确的答案。我决定使用包装器,它将您的答案与原始函数定义结合在一起。这只在对象属性和函数参数的顺序匹配时才起作用,通常情况下并非如此。@wensveen您想要什么?如果我可以更改函数的定义,这将是正确的答案。我决定使用包装器,它将您的答案与原始函数定义结合起来。这与@FelixKling的注释基本相同。我喜欢它,但它非常粗糙。这与@FelixKling的评论基本相同。我喜欢,但它很粗糙。