您能否动态解构一个对象以用于柯里化?

Can you dynamically deconstruct an object for usage with currying?

我一直在玩函数式 javascript 并且有一个使用解构的 util 函数的想法。

是否可以使用 ...rest 传递对象键的名称以便稍后过滤掉属性?

通读...其余文档,我没有看到任何关于解构的提及。

如果不是,什么解决方案可以解决这个问题?

const stripObject = attr => ({ ...attr }) => ({ ...attr });

const getUserProps = stripObject(['_id', 'firstName']);

console.log(getUserProps({ _id: 1, firstName: 'foo', lastName: 'bar' }));

/*
I understand right now whats happening is the []
passed is being ignored and its just returning a 
function that passing in all the props 
{
  _id: 1,
  firstName: 'foo'
}
*/

{ ...attr }参数位置表示"get all properties of the passed in object and assign it to a new object assigned to attr"。 IE。您只是在创建传入对象的浅表克隆。

即这两个函数除了克隆部分是等价的

({...foo}) => foo
foo => foo

所以不,你想要的是不可能的(这种方式)。 不能动态声明参数。

如果你想拉出特定的道具,你可以根据你的要求调整这种方法(One-liner to take some properties from object in ES 6):

const stripObject = attr => obj => pick(obj, ...attr);

在了解到我最初不可能的解决方案后,我最终使用的是减少最初传递的键,然后从对象中获取道具。

const stripObject = keys => obj => {
  return keys.reduce((p, c) => (
    { ...p, [c]: obj[c] }
  ), {});
};
const getUserProps = stripObject(['_id', 'firstName']);

console.log(getUserProps({
  _id: 1,
  firstName: 'foo',
  lastName: 'bar'
}));

万一你喜欢传播东西,你可以传播一个特别准备的代理:)

const stripObject = attrs => obj => ({ ...new Proxy(obj, {
    ownKeys() {
      return attrs
    }
  })
});

const getUserProps = stripObject(['_id', 'firstName']);

console.log(getUserProps({
  _id: 1,
  firstName: 'foo',
  lastName: 'bar'
}));