如何通过模式获取对象键?

ajs*_*sie 16 javascript regex

我有一个带有命名键的对象:

var names = {
  "Peter Pan": {...},
  "Peter Parker": {...},
  "Tony Stark": {...},
  ...
}
Run Code Online (Sandbox Code Playgroud)

有没有办法通过模式获取所有键,例如.所有的钥匙都有彼得?

情况是我希望将所有过滤的密钥放在一个数组中,例如:

var filteredNames: [
  "Peter Pan",
  "Peter Parker",
  ...
]
Run Code Online (Sandbox Code Playgroud)

Lep*_*eus 21

您可以通过自己循环键来轻松完成:

var filtered_keys = function(obj, filter) {
  var key, keys = [];
  for (key in obj) {
    if (obj.hasOwnProperty(key) && filter.test(key)) {
      keys.push(key);
    }
  }
  return keys;
}
// example:
var filteredNames = filtered_keys(names, /Peter/); // second parameter is a javascript regex object, so for exemple for case insensitive you would do /Peter/i    
Run Code Online (Sandbox Code Playgroud)

ES6

let filtered_keys = (obj, filter) => {
  let key, keys = []
  for (key in obj)
    if (obj.hasOwnProperty(key) && filter.test(key))
      keys.push(key)
  return keys
}

// example:
let filteredNames = filtered_keys(names, /Peter/)
Run Code Online (Sandbox Code Playgroud)

  • +1使用*hasOwnProperty*.如果需要纯文本的完全匹配,则不需要正则表达式(该字符串将通过*match*转换为RegExp).如果使用常规epxression,*test*更合适,因为它是一个更简单的算法并返回一个布尔值(例如`filter.test(key)`),而*match*返回一个将转换为boolean类型的数组. (4认同)

Gab*_*iel 16

var filteredNames = Object.keys(names).filter((name) => /Peter/.test(name));
Run Code Online (Sandbox Code Playgroud)