假设我有一个对象:

{
  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 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(结果);

下面的方法获取要过滤的对象和任何属性。

函数removeObjectKeys(obj,…keysToRemove) { let mObject ={…obj} for (let key of keysToRemove) { const{[字符串(键)]:_,…rest} = mObject mObject ={…休息} } 返回mObject } Const obj = {123: "hello", 345: "world", 567: "and kitty"}; const filtered = removeObjectKeys(obj, 123); console.log(过滤); const twoFiltered = removeObjectKeys(obj, 345,567); console.log (twoFiltered);

如果你有一个允许值的列表,你可以很容易地将它们保留在一个对象中:

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(生);

我使用这个示例是为了展示一个基于突变的解决方案,但我不建议使用它。

我很惊讶居然没有人提出这个建议。它非常干净,非常明确地告诉你想要保留哪些键。

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);

简单的方法!这样做。

const myData = { Item1: {key: 'sdfd', value:'sdfd'}, Item2: {key: 'sdfd', value:'sdfd'}, Item3:{键:'sdfd',值:'sdfd'} }; const {item1, item3} = myData Const result =({item1,item3})