Как я могу получить ключи объектов по шаблону?

У меня есть объект с именованными ключами:

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

Есть ли способ получить все ключи по шаблону, например. все ключи, в которых есть Питер?

Дело в том, что я хочу иметь все отфильтрованные ключи в массиве, например:

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

Ответ 1

Вы можете легко сделать это, перейдя по клавишам самостоятельно:

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

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

Ответ 2

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

Ответ 3

Если вы хотите, чтобы он учитывал регистр:

var filteredNames = [];

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

Если не:

var filteredNames = [];

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

Ответ 4

Вы можете расширить прототип JavaScript Array, например:

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;
  }
}

Теперь я на самом деле не протестировал этот код, но это даст все массивы, которые вы создаете в JavaScript, метод.regex_search, который принимает аргумент "pattern". Это либо вернет false, если совпадения не найдены, либо массив индексов, когда элементы соответствуют.

Затем вы можете перебрать этот массив и взять эти индексы из исходного массива.

Ответ 5

ECMAscript 5.1 предоставляет Object.keys() для возврата имен свойств объекта.

var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']

Источник.

Стандарт.