拦截JavaScript中的结构化函数参数?

oxcyiej7  于 2023-01-16  发布在  Java
关注(0)|答案(1)|浏览(108)

有没有什么方法或模式可以让我在不知道参数签名的情况下,拦截结构化函数参数,并在函数执行之前对它们进行处理?例如:

const add = ({a, b}) => a + b
const multiplyArgs = (fun) => (...args) => fun(...args.map(x => x * 10)) // Won't work
const res = multiplyArgs(add)({a: 5, b: 10, c: 20}) // 150, won't perform the multiplication on c

到目前为止,我找到的唯一选择是使用正则表达式从函数的字符串表示中获取参数,但这非常麻烦。
编辑:
实际使用情形如下:
我有一个带有RxJS观察对象/主题的对象,希望能够调用一个函数/方法,该函数/方法将接收另一个函数,从对象中选取所需的观察对象,将它们组合起来,然后将函数通过管道传输到新组合的观察对象。

const observablePool = {a: new Rx.BehaviorSubject(5), b: new Rx.BehaviorSubject(10)}
updatePool( ({a, b}) => ({c: a + b}) ) 
// In the background:
// const picked = {a: observablePool.a, b: observablePool.b}
// observablePool.c = Rx.combineLatest(picked)
// .pipe(Rx.map({a, b} => a + b))

这个想法是为了隐藏访问观察对象和创建新的组合观察对象的实现,用户应该能够链接简单的函数,其结果将自动提升到观察对象中。
我可以通过添加一个pick()函数来实现,即updatePool(pick("a", "b"), ({a, b}) => ({c: a + b}) ),但它会复制和解耦参数名称,我想知道是否有更优雅的解决方案。

wn9m85ua

wn9m85ua1#

对于一个对象参数,可以Map到Object.entries

const add = ({a, b}) => a + b;
const multiplyObj0 = fun => obj => fun(Object.fromEntries(Object.entries(obj)
      .map(([k, v])=>[k, v * 10])));
const res = multiplyObj0(add)({a: 5, b: 10});
console.log(res);

相关问题