>

나는 이것을 과도하게 과장했다는 것을 알고 있지만 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

  • 답변 # 1

    단일 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  대소 문자를 구분하지 않는 수정 자입니다.

  • 답변 # 2

    Array#filter 를 사용합니다  정규 표현식 :

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

  • 답변 # 3

    다른 답변은 훌륭하지만 아래에 표시된이 방법을 고려하십시오. 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()
    
    

관련 자료

  • 이전 asp.net core - Identity Server 4를 사용하여 iOS (사파리 및 크롬)에서 무한 루프 인증을 진단하는 데 필요한 지침
  • 다음 terraform에서 countindex를 사용하고 있습니까?