假设我有一个对象:
{
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,所以扩散操作符是可用的。
你现在可以使用Object.fromEntries方法(检查浏览器支持)使它更短更简单:
const raw = { item1: { prop:'1' }, item2: { prop:'2' }, item3: { prop:'3' } };
const allowed = ['item1', 'item3'];
const filtered = Object.fromEntries(
Object.entries(raw).filter(
([key, val])=>allowed.includes(key)
)
);
阅读更多信息:Object.fromEntries
这里的答案肯定是合适的,但它们有点慢,因为它们需要对对象中的每个属性遍历白名单。下面的解决方案对于大型数据集来说要快得多,因为它只在白名单中循环一次:
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 raw = {
item1: { key: 'sdfd', value:'sdfd' },
item2: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
};
const allowed = ['item1', 'item3'];
const filtered = allowed.reduce((obj, key) => {
obj[key] = raw[key];
return obj
}, {})
console.log(filtered);
特别是对于较大的源对象(在本例中为原始对象),这是有意义的。迭代不会使用源的所有条目执行,而只使用您想要过滤的键,因此更短/更快…
演示在这小提琴…
但我必须说,我也喜欢这个答案中的解决方案使用object。fromentries数组。filter和Array.includes:
const object = object . fromentries (
Object.entries(生)。Filter (([key, value]) => allowed.includes(key))
);
演示在这小提琴…
如果你有一个允许值的列表,你可以很容易地将它们保留在一个对象中:
Const raw = {
Item1: {key: 'sdfd', value:'sdfd'},
Item2: {key: 'sdfd', value:'sdfd'},
Item3:{键:'sdfd',值:'sdfd'}
};
Const allowed = ['item1', 'item3'];
const filtered = Object.keys(raw)
.filter(key => allowed.includes(key))
.reduce((obj, key) => {
Obj [key] = raw[key];
返回obj;
}, {});
console.log(过滤);
这个用途:
对象。键来列出原始(原始数据)中的所有属性
Array.prototype.filter选择允许列表中出现的键,使用
Array.prototype.includes以确保它们存在
reduce构建一个只包含允许属性的新对象。
这将使用允许的属性创建一个浅拷贝(但不会复制属性本身)。
你也可以使用对象扩展操作符来创建一系列对象而不改变它们(感谢rjerue提到了这一点):
Const raw = {
Item1: {key: 'sdfd', value:'sdfd'},
Item2: {key: 'sdfd', value:'sdfd'},
Item3:{键:'sdfd',值:'sdfd'}
};
Const allowed = ['item1', 'item3'];
const filtered = Object.keys(raw)
.filter(key => allowed.includes(key))
.reduce((obj, key) => {
返回{
obj,
(例子):生(例子)
};
}, {});
console.log(过滤);
出于琐事的目的,如果你想从原始数据中删除不需要的字段(我不建议这样做,因为它涉及一些丑陋的突变),你可以像这样反转includes检查:
Const raw = {
Item1: {key: 'sdfd', value:'sdfd'},
Item2: {key: 'sdfd', value:'sdfd'},
Item3:{键:'sdfd',值:'sdfd'}
};
Const allowed = ['item1', 'item3'];
种(生)
.filter(key => !allowed.includes(key))
.forEach(key => delete raw[key]);
console.log(生);
我使用这个示例是为了展示一个基于突变的解决方案,但我不建议使用它。