在ES6中通过键过滤对象属性
可以说我有一个对象:
{ item1: { key: 'sdfd', value:'sdfd' }, item2: { key: 'sdfd', value:'sdfd' }, item3: { key: 'sdfd', value:'sdfd' } }
我想通过过滤上面的对象来创build另一个对象,所以我有类似的东西。
{ item1: { key: 'sdfd', value:'sdfd' }, item3: { key: 'sdfd', value:'sdfd' } }
我正在寻找一个干净的方式来完成这个使用Es6,所以传播运营商可用于我。 谢谢!
如果您有一个允许的值列表,您可以使用以下方法轻松地将其保留在一个对象中:
const raw = { item1: { key: 'sdfd', value:'sdfd' }, item2: { key: 'sdfd', value:'sdfd' }, item3: { key: 'sdfd', value:'sdfd' } }; const allowed = ['item1', 'item3']; const filtered = Object.keys(raw) .filter(key => allowed.includes(key)) .reduce((obj, key) => { obj[key] = raw[key]; return obj; }, {}); console.log(filtered);
如果你使用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' } };
或者,如果您将密钥存储为string:
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, ...
这不仅可以将您的操作减less到一行,而且也不需要您知道其他键(您要保留的键)。
你可以添加一个通用的ofilter
(用通用的oreduce
实现),所以你可以很容易地过滤对象的方式,你可以数组。
const oreduce = (f, acc, o)=> Object.keys(o).reduce((acc, k)=> f(acc, o[k], k, o), acc) const ofilter = (f, o)=> oreduce ((acc, v, k, o)=> f(v, k, o) ? Object.assign(acc, {[k]: v}) : acc, {}, o) let data = { item1: { key: 'sdfd', value:'sdfd' }, item2: { key: 'sdfd', value:'sdfd' }, item3: { key: 'sdfd', value:'sdfd' } } // filter data where k ("key") is not equal to 'item2' let result = ofilter ((v,k)=> k !== 'item2', data) console.log(result)
你可以find最清洁的方式是用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 dummyObj = Object.assign({}, obj); delete dummyObj[key]; const target = Object.assign({}, {...dummyObj});
没有之前没有提到的,但是将一些答案与一般的ES6答案结合起来:
const raw = { item1: { key: 'sdfd', value: 'sdfd' }, item2: { key: 'sdfd', value: 'sdfd' }, item3: { key: 'sdfd', value: 'sdfd' } }; const filteredKeys = ['item1', 'item3']; const filtered = filteredKeys .reduce((obj, key) => ({ ...obj, [key]: raw[key] }), {}); console.log(filtered);