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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6754990/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-25 21:43:59  来源:igfitidea点击:

How to do I get object keys by a pattern?

javascriptregex

提问by ajsie

I have an object with named keys:

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

var names = {
  "Peter Pan": {...},
  "Peter Parker": {...},
  "Tony Stark": {...},
  ...
}

Is there a way to get all keys by a pattern eg. all keys having Peter in it?

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

The case is that I want to have all the filtered keys in an array eg:

情况是我想在一个数组中包含所有过滤的键,例如:

var filteredNames: [
  "Peter Pan",
  "Peter Parker",
  ...
]

回答by Lepidosteus

You can easily do it by looping over the keys yourself:

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

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    


ES6

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/)

回答by Gabriel

var filteredNames = Object.keys(names).filter((name) => /Peter/.test(name));

回答by user113716

If you want it case sensitive:

如果您希望区分大小写:

var filteredNames = [];

for( name in names ) {
    if( name.indexOf( "Peter" ) > -1 ) {
        filteredNames.push( name );
    }
}

If not:

如果不:

var filteredNames = [];

for( name in names ) {
    if( /peter/gi.test( name ) ) {
        filteredNames.push( name );
    }
}

回答by supakeen

You could extend the JavaScript Array prototype, like so:

您可以扩展 JavaScript 数组原型,如下所示:

Array.prototype.regex_search = function(pattern) {
  var returns = [];
  for(var i = 0; i < this.length; i++) {
    if(this[i].match(pattern) {
      returns.push(i);
    }
  }
  if(returns.length) {
    return returns;
  } else {
    return false;
  }
}

Now I haven't actually tested this code but this would give all arrays you create in JavaScript a method .regex_search which takes an argument 'pattern'. This will either return false when no matches are found or an array of indices when elements match.

现在我还没有真正测试过这段代码,但这会给你在 JavaScript 中创建的所有数组提供一个方法 .regex_search,它接受一个参数“模式”。这将在找不到匹配项时返回 false 或在元素匹配时返回索引数组。

You could then iterate over this array and take those indices from the original array.

然后您可以迭代这个数组并从原始数组中获取这些索引。