【问题标题】:Javascript ternary operator inside forEach returns undefinedforEach 中的 Javascript 三元运算符返回未定义
【发布时间】:2015-08-30 14:58:14
【问题描述】:

我正在尝试编写一个函数,该函数接受一个字符串并将每个单词中未包含在“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”将不会大写,但一旦我不再滥用我在这里拥有的工具,我就会弄清楚这一点。 . .

【问题讨论】:

  • 那是因为你没有对wordword[0].toUpperCase() + word.slice(1) 做任何事情。您可能指的是 map 而不是 forEach 并忘记了 return 的值。
  • undefined 不会返回两次,而是返回一次并记录一次。 titleCase1 中也没有 return 语句。
  • 用 .map 替换 .forEach 并在三元条件之前添加 return 并解决了我遇到的问题,尽管(minorArray 中的单词)对于每个单词都被评估为 false 并且它们都大写,这是一个不同的问题。 . .

标签: javascript string foreach closures ternary


【解决方案1】:

您的代码有两个问题:

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

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

  2. 您不能使用in 运算符来查看您的数组中是否存在单词。 in 运算符仅检查指定对象中是否存在指定属性。因此,当用于检查 Array 内的元素时,它将始终返回 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 的工作原理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' ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多