Javascript 对象的白名单属性的对象分解({x,y,…rest})

Javascript 对象的白名单属性的对象分解({x,y,…rest}),javascript,ecmascript-6,destructuring,ecmascript-next,Javascript,Ecmascript 6,Destructuring,Ecmascript Next,使用可直接将对象的属性列入黑名单,如以下示例所示: const original = { a: 1, b: 2, c: 3, evil: "evil", ugly: "ugly", }; const { evil, ugly, ...sanitized } = original; console.log(sanitized); // prints { a: 1, b: 2, c: 3 } 我想知道是否存在类似的简洁方法来做同样的事情,但是使用一个白色的属性列表(在示

使用可直接将对象的属性列入黑名单,如以下示例所示:

const original = {
  a: 1,
  b: 2,
  c: 3,
  evil: "evil",
  ugly: "ugly",
};

const { evil, ugly, ...sanitized } = original;

console.log(sanitized);   // prints { a: 1, b: 2, c: 3 }
我想知道是否存在类似的简洁方法来做同样的事情,但是使用一个白色的属性列表(在示例中:
{a,b,c}
)。通常,我必须将可用属性的子集转换为JSON,这样的功能将使代码更可读、更安全

我发现了一个类似的问题,但不是完全相同的问题:

编辑:很遗憾,下一个代码不起作用,因为它返回的是原始对象,而不是经过过滤的对象

const sanitized = {a, b, c} = original;     
// sanitized === original

为此,我使用了2个辅助函数

export const pickProps = (object, ...props) => (
  props.reduce((a, x) => {
    if (object.hasOwnProperty(x)) a[x] = object[x];
    return a;
  }, {})
);

export const omitProps = (object, ...props) => {
  const no = {...object};
  props.forEach(p => delete no[p]);
  return no;
};
你也可以

const original = {
  a: 1,
  b: 2,
  c: 3,
  evil: "evil",
  ugly: "ugly",
};

const { a, b, c } = original;
const filtered = { a, b, c };
我不认为你的“黑名单”方法是好的,因为它不必要地将
original.evil
分配给
evil
,并将
original.ught
分配给
ught

您可以尝试以下方法:

const blacklistFilter=(obj,blacklist)=>Object.entries(obj)
.filter(([key,value])=>!黑名单。包括(key))
.reduce((obj[key,value])=>(obj[key]=value,obj),{})
const whitelistFilter=(obj,whitelist)=>Object.entries(obj)
.filter(([key,value])=>白名单。包括(key))
.reduce((obj[key,value])=>(obj[key]=value,obj),{})
常量原始={
a:1
,b:2
,c:3
,邪恶:“邪恶”
,丑陋:“丑陋”
}
log(blacklistFilter(原始,['evil','Shugh']))

log(whitelistFilter(原始,['a','b','c'])
您的意思是只有特定属性的rest对象吗?不,不是一步到位的。你可以做
const{a,b}=original;const new={a,b}但您不会得到比这更简洁的结果。@nils不一定在rest中。我想知道是否存在,或者是否有人提出一种惯用的方法来复制白名单属性的子集。我知道你提出的解决方案,但我不想重复那样的道具。没有原生解决方案。但是你可以使用。所谓的“扩展点符号”建议允许你说
对象。{a,b,c}
,从
对象
中“拾取”
a
b
、和
c
,并从中创建新对象。这已在es讨论邮件列表中讨论过。请看。我真的认为如果赋值运算符的计算结果不是它的正确操作数,那将是一个遗憾。是的,我现在正在使用类似于
pickProps
的东西,但我想知道这种情况是否有直接的语法支持。您阅读了这个问题中的注释吗?