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