我正在尝试编写一个带字符串的函数,并将每个单词中的第一个字母大写,而不包含在“minorWords”字符串中。我的代码中缺少什么导致返回值为“未定义”?在写完这个函数之后我会想到几个不同的方法,我只是错误地使用了.forEach。我相当肯定我正在使用三元运算符,但我尝试用if语句替换并获得相同的结果(未定义)。我也不确定为什么undefined会被返回两次。 。
function titleCase1(title, minorWords) {
var titleArray = title.split(" ");
var minorArray = minorWords.split(" ");
var newArray = titleArray.forEach(function(word){
(word in minorArray)? word :
word[0].toUpperCase() + word.slice(1);
})
console.log(newArray);
}
titleCase1("the wind in the willows", "the in");
// -> undefined undefined
我意识到,如果这有效,第一个“the”将不会被大写,但是一旦我不再滥用我在这里的工具,我就会想到这一点。 。
答案 0 :(得分:1)
您的代码存在两个问题:
forEach
唯一能做的就是对数组中的每个元素执行回调,并且不返回任何内容,因此newArray
始终为undefined
。有关参考,请查看forEach
的工作原理here。
如果您想创建一个新数组,其值与您尝试使用newArray
的方式相同。您需要使用map
,但实际上您需要从回调中返回一个值。有关参考,请查看map
的工作原理here。
您无法使用in
运算符查看数组中是否存在单词。 in
运算符仅检查指定的Object中是否存在指定的属性。因此,当用于检查Array内部的元素时,它将始终返回false
。 因为javascript中的数组实际上是一个对象!
var a = [ '一个&#39 ;, ' B&#39 ;, ' C' ];
实际上是
var a = { 0:' a', 1:' b', 2:' c' };
因此'a' in [ 'a', 'b', 'c' ]
将始终返回false
,例如0 in [ 'a', 'b', 'c' ]
将返回true
。
由于这个警告,您应该改变您的方法,例如使用indexOf
。有关参考,请查看indexOf
的工作原理here。
考虑到这一点,您可以将代码修改为以下内容以获得所需的行为:
function titleCase1(title, minorWords) {
var titleArray = title.split(' ');
var minorArray = minorWords.split(' ');
var newArray = titleArray.map(function (word) {
// indexOf returns the elements index on match or -1.
var match = minorArray.indexOf(word) != -1;
// If there's a match, return the (lowercased) word, otherwise uppercase it.
return match ? word : (word[0].toUpperCase() + word.slice(1));
});
console.log(newArray);
}
titleCase1("the wind in the willows", "the in"); // [ 'the', 'Wind', 'in', 'the', 'Willows' ]