我意识到我已经对它进行了过度设计,但是当我刚开始使用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
答案 0 :(得分:2)
您可以为此使用单个RegExp和Array.prototype.filter()
:
console.log([
'Foo',
'Bar',
'Abc',
'Lorem',
'Ipsum'
].filter(str => /^[aeiou]/i.test(str)));
Array.prototype.filter()
返回一个新数组,其中包含所有通过谓词(返回真实值)的元素。
RegExp.prototype.test()
返回true
。
然后,/^[aeiou]/i
的意思是:
^
匹配字符串的开头。[aeiou]
一次匹配方括号内的任何字符。i
是不区分大小写的修饰符。答案 1 :(得分:1)
我会使用Array#filter
和regular 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的基石(如数组方法)。
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()