Фильтровать массив строк, оставляя только те, которые начинаются с гласных - PullRequest
0 голосов
/ 26 августа 2018

Я понимаю, что я в значительной степени переоценил это, но поскольку я только начинаю с JS, я не могу думать о том, как сконцентрировать это во что-то не совсем смешное.Я знаю, что, вероятно, собираюсь надрать себя здесь, но может ли кто-нибудь изменить это для меня?

Цель состояла в том, чтобы создать новый массив из предоставленного, который содержал бы только строки, начинающиеся с гласных.Также необходимо учитывать регистр символов.

let results = []

for (let i = 0; i < strings.length; i++) {
  if ((strings[i].startsWith('a')) || (strings[i].startsWith('A')) || (strings[i].startsWith('e')) || (strings[i].startsWith('E')) || (strings[i].startsWith('i')) || (strings[i].startsWith('I')) || (strings[i].startsWith('o')) || (strings[i].startsWith('O')) || (strings[i].startsWith('u')) || (strings[i].startsWith('U'))) {
    results.push(strings[i])
  }
}

return results

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Для этого вы можете использовать RegExp и Array.prototype.filter():

console.log([
  'Foo',
  'Bar',
  'Abc',
  'Lorem',
  'Ipsum'
].filter(str => /^[aeiou]/i.test(str)));

Array.prototype.filter() возвращает новый массив со всеми элементами, которые передают (возвращают истинное значение) предикат.

RegExp.prototype.test() возвращает true, если RegExp находит совпадение в строке, которую вы передаете.

Тогда /^[aeiou]/i означает:

  • ^соответствует началу строки.
  • [aeiou] соответствует любому символу в квадратных скобках, по одному разу.
  • i - модификатор без учета регистра.
0 голосов
/ 13 марта 2019

Другие ответы хороши, но, пожалуйста, рассмотрите этот подход, показанный ниже.Если вы новичок в JS, это, безусловно, поможет вам понять краеугольные камни JS, такие как методы его массивов.

  • Метод map () создает новый массив с результатами вызова предоставленной функции для каждого элементав вызывающем массиве.

var new_array = arr.map(function callback(currentValue, index, array {
      // Return element for new_array
    }, thisArg)

Попробуйте использовать веб-сайт REPL, такой как https://repl.it/, чтобы увидеть, что делают эти методы ...

Ниже предлагается мой ответ...

function onlyVowels(array) {
// For every element (word) in array we will...
  return array.map((element) => {
    //  ...convert the word to an array with only characters...
    return (element.split('').map((char) => {
      // ...and map will only return those matching the regex expression
      // (a || e || i || o || u)
      // parameter /i makes it case insensitive
      // parameter /g makes it global so it does not return after 
      // finding first match or "only one"
      return char.match(/[aeiou]/ig)
    // After getting an array with only the vowels the join function
    // converts it to a string, thus returning the desired value
    })).join('')
  })
};

function test() {
  var input = ['average', 'exceptional', 'amazing'];
  var expected = ['aeae', 'eeioa', 'aai']
  var actual = onlyVowels(input)

  console.log(expected);
  console.log(actual);
};

test()
0 голосов
/ 26 августа 2018

Я бы использовал Array#filter и регулярное выражение :

let rex = /^[aeiou]/i;
let results = strings.filter(str => rex.test(str));

/^[aeiou]/i говорит "В начале строки (^), соответствует a, e, i, o или u, без учета регистра (флаг i). "

Live Пример:

let strings = [
  "I'll match",
  "But I won't",
  "And I will",
  "This is another one that won't",
  "Useful match here"
];
let rex = /^[aeiou]/i;
let results = strings.filter(str => rex.test(str));

console.log(results);
...