Javascript 函数调用的对象分解

Javascript 函数调用的对象分解,javascript,typescript,function,object,ecmascript-6,Javascript,Typescript,Function,Object,Ecmascript 6,有没有办法就地解构JS对象,而不是将解构的变量分配给作用域 而不是这样做: const { a, b, c } = obj; someFunction(a, b, c); 我想这样做: someFunction({a, b, c} from obj); 或者功能相当的东西 我希望在有以下两个规定的情况下这样做: 我不想把变量名放入封闭范围 我不想传递整个对象obj,因此不能使用扩展运算符 我剩下的唯一选择就是使用 someFunction(obj.a, obj.b, obj.c); 在

有没有办法就地解构JS对象,而不是将解构的变量分配给作用域

而不是这样做:

const { a, b, c } = obj;
someFunction(a, b, c);
我想这样做:

someFunction({a, b, c} from obj);
或者功能相当的东西

我希望在有以下两个规定的情况下这样做:

  • 我不想把变量名放入封闭范围

  • 我不想传递整个对象
    obj
    ,因此不能使用扩展运算符

我剩下的唯一选择就是使用

someFunction(obj.a, obj.b, obj.c);
在这种情况下这很好,但是当
obj
是一个长标识符时,可读性会降低

这样的事情可能吗?我尝试在表达式中使用赋值作为解决方法,但我的IDE抱怨它找不到名称
a
b
c

someFunction({a, b, c} = obj);

一个选项是使用
.map
提取所需每个属性的值,并将其分散到参数列表中:

someFunction(
  ...['a', 'b', 'c'].map(prop => obj[prop])
);
不幸的是,解构需要创建中间变量,这是您不想要的。

iLife应该可以:

((({ a, b, c }) => someFunction(a, b, c))(obj);
我会这样做:

函数foo({x,y}){ 控制台日志(x,y); } foo({y:1,x:2});//2 1来自对象分解的函数调用,参数未知 当您无法访问或更改函数声明,或者您不想访问或更改函数声明时,就需要这样做

const getParamNames = func => {
    const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
    const ARGUMENT_NAMES = /([^\s,]+)/g;
    let fnStr = func.toString().replace(STRIP_COMMENTS, '');
    let result = fnStr.slice(fnStr.indexOf('(')+1, 
    fnStr.indexOf(')')).match(ARGUMENT_NAMES);
    if (result === null) result = [];
    return result;
}

const callFunctionFromObject = (func, obj) => {
    let params = getParamNames2(func)
    return func(...params.map(prop => obj[prop]))
}
用法示例:

//Function declared somewhere:
var logForStackOverflow = (a, b, c) => console.log(a, b, c)

//ex1
callFunctionFromObject(logForStackOverflow, {a: 1});
1 undefined undefined
//ex2
callFunctionFromObject(logForStackOverflow, {b: 1})
undefined 1 undefined
//ex3
callFunctionFromObject(logForStackOverflow, {b: "hello", c:3, a:[1, 2, 3]})
[1, 2, 3] "hello" 3
多亏了。解决方案
如果您有任何问题,请给我留言。谢谢

当对象的属性顺序与前N个参数对齐时,您可以使用:

someFunction(…对象值(obj))

不幸的是,中间层是必需的,因为在某些情况下(比如我的情况下),这只是一种不必要的性能损失。至于你的建议,我喜欢它比
obj.property
更具可扩展性,但它仍然非常冗长:/足够了,因此我确信我不能将它投入生产代码,而不进行代码审查。性能很少是需要担心的问题-在99%的情况下,代码可读性更重要,如果您想保持代码的干性,并且希望能够对任意数量的属性使用该模式,我非常确定这是您能够找到的最佳模式。如果因为太冗长而导致代码审查失败,我认为这表明代码审查存在问题,而不是这里的代码问题。我同意你的所有说法,尤其是最后一条(但遗憾的是,我的观点没有超过传统)。也许我应该试一试,看看会发生什么。我喜欢这样做,但我不喜欢在需要调用
someFunction
时生成函数的性能损失。另外,与另一个答案类似,这看起来很不寻常,我认为它不会通过代码审查:/。如果您针对的是es6环境,您可以使用解构参数定义您的函数,例如
function f({a,b,c}){/*…*/}
或者你不想这样,因为你不想传递整个对象。你能解释一下这是如何解决我的问题的吗?我看不出有什么强关系。你把一个对象作为参数传递,然后把它作为函数参数解构。我知道你说过你不想把整个对象作为参数传递,这仍然是我的建议。对,但这意味着我必须是编写函数的人。对于我自己的代码来说很好,但是在很多情况下,我无法控制函数的参数,例如库,或者为公司编码时的大部分成本。@@AnthonyMonterrosa如果这是一个大问题,我会将此样式用作库调用的包装函数,例如
函数wrapLib({x,y}){return library.expensiveCall(x,y)}
。如果情况需要,可以缓存结果。或者,TC39总是在寻找对JS的独特改进。