假设我有一个对象:
{
item1: { key: 'sdfd', value:'sdfd' },
item2: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
我想通过过滤上面的对象来创建另一个对象这样我就有了。
{
item1: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
我正在寻找一种干净的方法来实现这一点使用Es6,所以扩散操作符是可用的。
这里的答案肯定是合适的,但它们有点慢,因为它们需要对对象中的每个属性遍历白名单。下面的解决方案对于大型数据集来说要快得多,因为它只在白名单中循环一次:
Const data = {
allowed1:“废话”,
Allowed2: 'blah blah',
记者:“哇”,
superSensitiveInfo:“whooooah”,
allowed3:“在那里”
};
Const whitelist = ['allowed1', 'allowed2', 'allowed3'];
函数净化(数据,白名单){
返回whitelist.reduce (
(result, key) =>
Data [key] !== undefined
? 对象。赋值(result, {[key]: data[key]})
:结果,
{}
);
}
Const result = sanitize(数据,白名单);
console.log(结果);
我很惊讶居然没有人提出这个建议。它非常干净,非常明确地告诉你想要保留哪些键。
const unfilteredObj = {a: ..., b:..., c:..., x:..., y:...}
const filterObject = ({a,b,c}) => ({a,b,c})
const filteredObject = filterObject(unfilteredObject)
或者如果你想要一个脏的眼线笔:
const unfilteredObj = {a: ..., b:..., c:..., x:..., y:...}
const filteredObject = (({a,b,c})=>({a,b,c}))(unfilteredObject);
如果你可以使用ES6语法,我发现最干净的方法是:
const data = {
item1: { key: 'sdfd', value:'sdfd' },
item2: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
};
const { item2, ...newData } = data;
现在,newData包含:
{
item1: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
};
或者,如果你将键存储为字符串:
const key = 'item2';
const { [key]: _, ...newData } = data;
在后一种情况下,[key]被转换为item2,但由于您使用的是const赋值,因此需要为赋值指定一个名称。_表示丢弃值。
更普遍的:
const { item2, ...newData } = data; // Assign item2 to item2
const { item2: someVarName, ...newData } = data; // Assign item2 to someVarName
const { item2: _, ...newData } = data; // Assign item2 to _
const { ['item2']: _, ...newData } = data; // Convert string to key first, ...
这不仅将您的操作减少到一行程序,而且还不需要知道其他键是什么(那些您想要保留的键)。
一个简单的效用函数是这样的:
function removePropFromObject(obj, prop) {
const { [prop]: _, ...rest } = obj
return { ...rest }
}