使用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
答案 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
分配给evil
,original.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中类似的方法)。