你可以用currying动态解构一个对象吗?

时间:2018-06-15 18:21:16

标签: javascript ecmascript-next

我一直在使用功能性的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'
}
*/

3 个答案:

答案 0 :(得分:2)

如果您想传播内容,可以传播专门准备的代理:)

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

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

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

答案 1 :(得分:1)

参数位置中的

public function deleteArea($area_id='area_id') { $result = $this->um->deleteArea($area_id); if ($result) { $this->session->set_flashdata('success', '<b>'.$area_name.'</b> deleted successfully on '.date('d/m/Y H:i:s')); } else { $this->session->set_flashdata('error', 'Something wrong! Please try again.'); } redirect(base_url('utilities/areaList')); } 表示“获取传入的对象的所有属性并将其分配给分配给{ ...attr }的新对象”。即你只是创建了一个传入的对象的浅层克隆。

即。除克隆部分

外,这两个函数是等价的
attr

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

如果您想提取特定道具,可以根据您的要求调整此方法(One-liner to take some properties from object in ES 6):

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

答案 2 :(得分:1)

在学习了我原本不可能的解决方案后,我最终使用的是减少最初传递的键,然后抓住prop形式的对象。

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'
}));