forEach中的Javascript三元操作符返回undefined

Javascript ternary operator inside forEach returns undefined

本文关键字:三元 操作符 返回 undefined 中的 Javascript forEach      更新时间:2023-09-26

我试图编写一个函数,该函数需要一个字符串,并将每个单词中的第一个字母大写,该单词不包括在" minorWords "字符串中。我的代码中缺少什么导致返回值为"未定义"?在以几种不同的方式编写这个函数之后,我现在认为我只是错误地使用了。foreach。我相当确定我正确地使用了三元操作符,但是我尝试替换if语句并得到了相同的结果(未定义)。我也不确定为什么未定义被返回两次…

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. forEach所做的唯一事情是对数组中的每个元素执行回调,并且不返回任何东西,因此newArray将始终是undefined。作为参考,请检查forEach在这里是如何工作的。

    如果你想创建一个新的数组值,就像你试图用newArray做的那样。您需要使用map,但实际上需要从回调返回一个值。参考map如何工作在这里

  2. 您不能使用in操作符来查看一个单词是否存在于您的数组中。in操作符只检查指定的属性是否存在于指定的对象中。因此,当用于检查数组内部的元素时,它总是返回false因为javascript中的数组实际上是一个对象!

    var a = ["一个","b","c"

    );

    var a = {0:"一个",1:"b",2: ' c '

    };

    因此'a' in [ 'a', 'b', 'c' ]将始终返回false,例如0 in [ 'a', 'b', 'c' ]将返回true

    由于这个警告,你应该改变你的方法,例如使用indexOf。参考indexOf如何工作在这里

考虑到这一点,您可以将代码修改为以下内容以获得所需的行为:
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' ]