繁体   English   中英

如何使用 ES6 中的值过滤对象

[英]How to filter an object with its values in ES6

在 ES6 中以这种方式过滤对象的最佳方法是什么?

起始数据:

const acceptedValues = ["value1","value3"]
const myObject = {
    prop1:"value1",
    prop2:"value2",
    prop3:"value3"
}

预期输出:

filteredObject = {
    prop1:"value1",
    prop3:"value3"
}

您可以使用reduce()创建新对象并使用includes()检查对象的值是否存在于数组中。

 const acceptedValues = ["value1", "value3"] const myObject = { prop1: "value1", prop2: "value2", prop3: "value3" } var filteredObject = Object.keys(myObject).reduce(function(r, e) { if (acceptedValues.includes(myObject[e])) r[e] = myObject[e] return r; }, {}) console.log(filteredObject)

对于 ES6,如果您需要静态代码(您确切地知道需要过滤哪些属性)并且它不依赖于应用程序状态,那么您可以使用以下解构技术:

const myObject = {
  prop1: 'value1',
  prop2: 'value2',
  prop3: 'value3'
}
const { prop2, ...filteredObject } = myObject

console.info({ filteredObject, prop2 })

你将拥有:

filteredObject: {prop1: "value1", prop3: "value3"}
prop2: "value2"

只是为了建立在@Nenad Vracar 好的答案之上,您可以使用对象而不是includes的 Array 以加快查找速度:

 const acceptedValues = ["value1", "value3"]; const myObject = { prop1: "value1", prop2: "value2", prop3: "value3" }; const lookup = acceptedValues.reduce( (memo, prop) => { memo[prop] = true; return memo; }); const filteredObject = Object.keys(myObject).reduce((filtered, key) => { if(lookup[myObject[key]]){ filtered[key] = myObject[key]; } return filtered; }, {}); console.log(filteredObject);

也不是includes不能完成这项工作,但我想提供另一种观点。

为什么不是一个简单的 for 循环?

 const acceptedValues = ["value1","value3"] const myObject = { prop1:"value1", prop2:"value2", prop3:"value3" }; var filteredObject = {}; for(e in myObject) { if (myObject.hasOwnProperty(e)) { if (acceptedValues.indexOf(myObject[e]) != -1) { filteredObject[e] = myObject[e]; } } } console.log(filteredObject);

IMO,“最佳方式”是 Lodash 方式

const filtered = _.pick(myObject, acceptedValues)

https://lodash.com/docs/4.17.10#pick

使用简单的 for 循环并按键获取对象。

 const acceptedValues = ["value1","value3"] const myObject = { prop1:"value1", prop2:"value2", prop3:"value3" } Object.prototype.getKeyByValue = function( value ) { for( var prop in this ) { if( this.hasOwnProperty( prop ) ) { if( this[ prop ] === value ) return prop; } } } for (var i in acceptedValues) { if (myObject.getKeyByValue(acceptedValues[i])){ console.log(acceptedValues[i]); } }

因为我还没有看到使用Object.entries的答案,所以这里有一个。 请注意,由于Object.entries()实现比Object.keys()慢得多,这也将比接受的答案慢,但有些人可能更喜欢这样的可读性或可扩展性(更容易通过不同的过滤功能)。

const acceptedValues = ["value1", "value3"];
const myObject = {
    prop1:"value1",
    prop2:"value2",
    prop3:"value3"
};
const filteredEntries = Object.entries(myObject).filter(([, v]) => acceptedValues.includes(v));
const filteredObject = Object.fromEntries(filteredEntries);

或者作为一个较长的单行:

const filteredObject = Object.fromEntries(Object.entries(myObject).filter(([, v]) => accepted.includes(v)));
function filter(myObject){
  var obj=Object.assign({},myObject);
  Object.keys(obj).forEach(function(key) {
      if(acceptedValues.indexOf(obj[key])<0) delete obj[key];
  });
  return obj;
}
const filteredObject=filter(myObject);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM