forEach中的Javascript三元运算符返回undefined

时间:2015-08-30 14:58:14

标签: javascript string foreach closures ternary

我正在尝试编写一个带字符串的函数,并将每个单词中的第一个字母大写,而不包含在“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”将不会被大写,但是一旦我不再滥用我在这里的工具,我就会想到这一点。 。

1 个答案:

答案 0 :(得分:1)

您的代码存在两个问题:

  1. forEach唯一能做的就是对数组中的每个元素执行回调,并且不返回任何内容,因此newArray始终为undefined。有关参考,请查看forEach的工作原理here

    如果您想创建一个新数组,其值与您尝试使用newArray的方式相同。您需要使用map,但实际上您需要从回调中返回一个值。有关参考,请查看map的工作原理here

  2. 您无法使用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

  3. 考虑到这一点,您可以将代码修改为以下内容以获得所需的行为:

    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' ]