假设我有一个对象:
{
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,所以扩散操作符是可用的。
你能找到的最干净的方法是使用Lodash#pick
const _ = require('lodash');
const allowed = ['item1', 'item3'];
const obj = {
item1: { key: 'sdfd', value:'sdfd' },
item2: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
const filteredObj = _.pick(obj, allowed)
这里的答案肯定是合适的,但它们有点慢,因为它们需要对对象中的每个属性遍历白名单。下面的解决方案对于大型数据集来说要快得多,因为它只在白名单中循环一次:
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(结果);
一个不使用过滤器的更简单的解决方案可以通过Object.entries()而不是Object.keys()实现。
const raw = {
item1: { key: 'sdfd', value:'sdfd' },
item2: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
};
const allowed = ['item1', 'item3'];
const filtered = Object.entries(raw).reduce((acc,elm)=>{
const [k,v] = elm
if (allowed.includes(k)) {
acc[k] = v
}
return acc
},{})