假设我有一个对象:
{
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,所以扩散操作符是可用的。
另一种方法是使用Array.prototype.forEach()作为
Const raw = {
item1: {
关键:“sdfd”,
价值:“sdfd”
},
第二条:{
关键:“sdfd”,
价值:“sdfd”
},
item3: {
关键:“sdfd”,
价值:“sdfd”
}
};
Const allowed = ['item1', 'item3', 'll '];
var finalObj = {};
允许的。forEach(allowedVal => {
如果原始[allowedVal])
finalObj[allowedVal] = raw[allowedVal]
})
console.log (finalObj)
它只包含原始数据中可用的那些键的值,从而防止添加任何垃圾数据。
基于以下两个答案:
https://stackoverflow.com/a/56081419/13819049
https://stackoverflow.com/a/54976713/13819049
我们可以:
const original = { a: 1, b: 2, c: 3 };
const allowed = ['a', 'b'];
const filtered = Object.fromEntries(allowed.map(k => [k, original[k]]));
哪个更干净更快:
https://jsbench.me/swkv2cbgkd/1
利用ssube的答案。
这是一个可重用的版本。
Object.filterByKey = function (obj, predicate) {
return Object.keys(obj)
.filter(key => predicate(key))
.reduce((out, key) => {
out[key] = obj[key];
return out;
}, {});
}
叫它use
const raw = {
item1: { key: 'sdfd', value:'sdfd' },
item2: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
};
const allowed = ['item1', 'item3'];
var filtered = Object.filterByKey(raw, key =>
return allowed.includes(key));
});
console.log(filtered);
ES6箭头函数的美妙之处在于,你不必将allowed作为参数传入。
我很惊讶居然没有人提出这个建议。它非常干净,非常明确地告诉你想要保留哪些键。
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);