您能否动态解构一个对象以用于柯里化?
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'
}));
我一直在玩函数式 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'
}));