过滤字符串数组,仅保留以元音开头的字符串

时间:2018-08-26 16:56:37

标签: javascript arrays refactoring startswith

我意识到我已经对它进行了过度设计,但是当我刚开始使用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 :(得分:2)

您可以为此使用单个RegExpArray.prototype.filter()

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

Array.prototype.filter()返回一个新数组,其中包含所有通过谓词(返回真实值)的元素。

如果RegExp在您传递的字符串上找到匹配项,则

RegExp.prototype.test()返回true

然后,/^[aeiou]/i的意思是:

  • ^匹配字符串的开头。
  • [aeiou]一次匹配方括号内的任何字符。
  • i是不区分大小写的修饰符。

答案 1 :(得分:1)

我会使用Array#filterregular expression

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

/^[aeiou]/i说:“在字符串(^的开头,匹配不区分大小写的a,e,i,o或u(i标志)。”

实时示例:

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

答案 2 :(得分:0)

其他答案也不错,但是请考虑以下所示的方法。 如果您不熟悉JS,它肯定会帮助您了解JS的基石(如数组方法)。

  • map()方法创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。

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

尝试使用像https://repl.it/这样的REPL网站,以了解这些方法的作用...

以下是我建议的答案...

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