对象解构({x,y,... rest})用于对象的白名单属性

时间:2016-08-25 14:16:16

标签: javascript ecmascript-6 destructuring ecmascript-next

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

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,这样的功能将使代码更具可读性和安全性。

我发现了类似的问题,但问题并不完全相同: Is there a more terse way to map properties of one object to another in ES6/ES2015?

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

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

2 个答案:

答案 0 :(得分:3)

为此,我使用了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 };

答案 1 :(得分:0)

我不认为你去黑名单"很好,因为它不必要地original.evil分配给eviloriginal.ugly分配给ugly

您可以尝试这种方法:



const blacklistFilter = (obj, blacklist) => Object.entries(obj)
  .filter(([key, value]) => !blacklist.includes(key))
  .reduce((obj, [key, value]) => (obj[key] = value, obj), {})

const whitelistFilter = (obj, whitelist) => Object.entries(obj)
  .filter(([key, value]) => whitelist.includes(key))
  .reduce((obj, [key, value]) => (obj[key] = value, obj), {})

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

console.log(blacklistFilter(original, ['evil', 'ugly']))
console.log(whitelistFilter(original, ['a', 'b', 'c']))




Object.entries()[key, value]格式返回一个对象键和对应值的数组,filter()方法根据它们是否被列入黑名单或者它们被列入白名单,reduce()方法将[key, value]数组转换回对象(与this answer中类似的方法)。