2013-03-27 36 views
1

人们会认为将3个字符的缩写转换为数字表示将是一件容易的事。 JavaScript说“NOPE!”。javascript-being-dumb体验当天

$(selector).each(function() { 
    // convert month abbreviation to numerical representation 
    var monthStr = $(this).text().match(/[^\/]*/)[0]; 
    var months = { 
     JAN: 1, 
     FEB: 2, 
     MAR: 3, 
     APR: 4, 
     MAY: 5, 
     JUN: 6, 
     JUL: 7, 
     AUG: 8, 
     SEP: 9, 
     OCT: 10, 
     NOV: 11, 
     DEC: 12 
    }; 
    var month = months[monthStr].toString(); 
    var date = $(this).text().replace(monthStr, month); 
    $(this).text(date); 
}); 

即使代码是有效的和作品,我的控制台还与以下错误进入疯狂:

Uncaught TypeError: Cannot call method 'toString' of undefined

由于选择的文本被正确地更换,这使得(至少根据绝对没有任何意义眼)。

当我声明'monthStr'变量时,该问题似乎开始了。如果我将它设置为静态“MAR”作为示例,并从我的“月”变量定义中除去'.toString()',则不再发生错误。

此外,唯一保存代码的是已经提到的'.toString()'转换为我的月变量。如果它不在那里,我最终会得到一个'未定义'的值。

只是想分享一下我当时正在使用JavaScript的愚蠢体验,并希望有人能够详细说明为什么会抛出这个错误,即使代码完美无瑕。

+2

尝试在设置后记录'monthStr'的值。 – 2013-03-27 00:08:02

+1

'months'是一个对象,你试图以数组的形式评估它的内容。这就是为什么'month [monthStr]'失败。 – 2013-03-27 00:09:02

+0

如果'monthStr'中有空格或其他意想不到的字符,那就可以解释它。你为什么不记录monthStr?当你记录'monthStr'时,找出它是否与你的月份缩写之一完全一致。 (这需要在最后检查空格) – ktm5124 2013-03-27 00:12:46

回答

1

问题最有可能与做:

$(selector).each(function() { ... });

什么选择是,有多少DOM对象被选中?这可能是一个没有日期作为文本的DOM对象被选中。

这里是再现您的错误示例:http://jsfiddle.net/m3Kza/1/(见控制台)

控制台:“遗漏的类型错误:不能调用方法'的未定义”的toString

<p>MAR/26/2013</p> 
<p>Hello world!</p> 

$('p').each(function() { 
    var month = $(this).text().match(/[^\/]*/)[0]; 

    var months = { 
     MAR: 3 
    }; 

    alert(months[month].toString()); 
}); 

这样做的原因是因为我们选择两个<p>元素,并且只有一个文本的日期。

如果我们限制了我们的代码有日期为文本DOM对象,它工作正常:http://jsfiddle.net/m3Kza/

<p>MAR/26/2013</p> 

var month = $('p').text().match(/[^\/]*/)[0]; 

var months = { 
    MAR: 3 
}; 

alert(months[month].toString()); 

您应该使用一个CSS类有日期作为文本元素,只有这些元素这样你就知道你在选择什么。

0

使用trim

var monthStr = $(this).text().match(/[^\/]*/)[0]; 
    monthStr = monthStr.trim(); 

    var months = { 
      "JAN": 1, 
      "FEB": 2, 
      "MAR": 3,  
     }; 

     var month = months[monthStr].toString(); 
     alert(month); 
+0

相信与否,这是我原来的。仍然抛出相同的错误。编辑:我不是一个向下投票顺便说一句。 :( – tenub 2013-03-27 00:12:52

+0

@tenub'monthStr'返回什么? – 2013-03-27 00:13:44

+0

行情没有区别:http://stackoverflow.com/questions/4348478/what-is-the-difference-between-object-keys-with-quotes – ktm5124 2013-03-27 00:14:19

0

我做你的代码的一些略有改善,并没有得到任何错误:

<!doctype html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8" /> 
     <title>Test the script</title> 
     <script type="text/javascript" src="jquery-1.9.0.js"></script> 
     <script> 
      $(document).ready(function(){ 
       $("div").each(function() { 
        // convert month abbreviation to numerical representation 
        var orgStr=$(this).text().trim().match(/[^\/]*/)[0]; 
        var monthStr = orgStr.toUpperCase().substr(0,3); 
        console.log("monthStr is:", monthStr); 
        var months = { 
         JAN: 1, 
         FEB: 2, 
         MAR: 3, 
         APR: 4, 
         MAY: 5, 
         JUN: 6, 
         JUL: 7, 
         AUG: 8, 
         SEP: 9, 
         OCT: 10, 
         NOV: 11, 
         DEC: 12 
        }; 
        if(months[monthStr]!==undefined){ 
         var month = months[monthStr].toString(); 
         var date = $(this).text().replace(orgStr, month); 
         $(this).text(date); 
        } 
       }); 
      }); 
     </script> 

    </head> 
    <body> 
     <div>JAN/22/2012</div> 
     <div> 
      JAN/22/2012</div> 
     <div>nope/22/2012</div> 
     <div>Feb/22/2012</div> 
     <div>dec/22/2012</div> 
     <div>jul/22/2012</div> 
     <div> 
      october/22/2012</div> 
    </body> 
</html> 
+0

增加检查月份的月份不在月份对象 – HMR 2013-03-27 01:06:56

0
  • 调用trim()直接应为你工作:

var monthStr = $(this).text().match(/[^\/]*/)[0].trim(); 
  • 添加一个if/else块,以确定正确的值月:

if(monthStr !== undefined && monthStr.length === 3) {

Actually you don't need this check if you just check if the element in the object exists.

  • ,然后检查是否months[monthStr]甚至存在:

var month = (months[monthStr]) ? months[monthStr].toString() : monthStr 

而对于全码

$("div").each(function() { 
    // convert month abbreviation to numerical representation 
    var el = $(this); 
    var monthStr = el.text().match(/[^\/]*/)[0].trim();   
    var months = { 
     JAN: 1, 
     FEB: 2, 
     MAR: 3, 
     APR: 4, 
     MAY: 5, 
     JUN: 6, 
     JUL: 7, 
     AUG: 8, 
     SEP: 9, 
     OCT: 10, 
     NOV: 11, 
     DEC: 12 
    }; 
    var month = (months[monthStr]) ? months[monthStr].toString() : monthStr; 
    el.text(el.text().replace(monthStr, month)); 
}); 

each()块元素的数量不应该的问题。我的小提琴有多个div s穿过each(),它工作得很好。

Fiddle with it