2017-06-16 70 views
0

我需要測試適當日期格式的輸入。我想接受幾種日期格式,所以我創建了一個驗證函數,用於測試至少有一種格式是否正確,並在這種情況下返回true。 我使用moment.js來測試日期。 當我只需鍵入與硬編碼字符串日期格式的情況下,功能的正常使用:moment.js從格式數組進行日期驗證

var multiDateValidator = function (value) 
{ 
    if ((moment(value, 'DD/MM/YYYY', true).isValid()) || 
     (moment(value, 'D/M/YYYY', true).isValid()) || 
     (moment(value, 'DD.MM.YYYY', true).isValid()) || 
     (moment(value, 'D.M.YYYY', true).isValid()) || 
     (moment(value, 'DD. MM. YYYY', true).isValid()) || 
     (moment(value, 'D. M. YYYY', true).isValid())) { 
     return true; 
    } 

    return false; 
}; 

但是,如果我想使用的允許的日期格式列表,這是行不通的,它永遠不會返回true 。

var allowedDateFormats = ['DD/MM/YYYY', 'D/M/YYYY', 'DD.MM.YYYY', 'D.M.YYYY', 'DD. MM. YYYY', 'D. M. YYYY']; 

var multiDateValidator = function (value) 
{ 
    allowedDateFormats.forEach(function(dateFormat) 
    { 
     if (moment(value, dateFormat, true).isValid()) { 
      return true; 
     } 
    }); 

    return false; 
}; 

第二個函數有什麼問題?我知道我不太擅長JavaScript,但它應該工作,不是嗎?

+0

範圍。 2代碼中的函數。 'return true'在第二個裏面,'return false'在第一個裏面。如果你添加了'console.log(「some text」);''above'return true',你會明白我的意思。 – JapanGuy

+1

你說得對,我不能使用.forEach(),我必須使用...。 你可以發表您的評論作爲答覆我可以確認嗎? 謝謝 –

+0

我已經發布我的評論作爲一個非常懶惰的解決方案,仍然有效的答案 – JapanGuy

回答

2

的是沒有必要使用forforEach循環。 Moment提供了使用多種格式解析字符串的moment(String, String[], String, Boolean);方法。

由於文檔說:

如果你不知道輸入字符串的確切格式,但知道這可能是許多之一,你可以使用的格式數組。

從版本開始2.3.0,Moment使用一些簡單的啓發式來確定使用哪種格式。爲了:

  • 建議格式導致valid日期超過無效的日期。
  • 更喜歡解析更多字符串而不是更少的格式,並且使用比less更多的格式,即更喜歡更嚴格的解析。
  • 優先考慮數組中較早的格式。

這裏工作生活樣本:

var allowedDateFormats = ['DD/MM/YYYY', 'D/M/YYYY', 'DD.MM.YYYY', 'D.M.YYYY', 'DD. MM. YYYY', 'D. M. YYYY']; 
 

 
var multiDateValidator = function (value){ 
 
    return moment(value, allowedDateFormats, true).isValid(); 
 
}; 
 

 
var test = ['01/01/2017', '01.01.2017', '2017-Jan-01']; 
 
for(var i=0; i<test.length; i++){ 
 
    console.log(test[i], multiDateValidator(test[i])); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

1

正如我在我的評論中提到,return true返回到內部功能,但它不停止執行外部函數,所以你的外部函數被執行每次(即每次返回false執行)

我的解決辦法將是:

var allowedDateFormats = ['DD/MM/YYYY', 'D/M/YYYY', 'DD.MM.YYYY', 'D.M.YYYY', 'DD. MM. YYYY', 'D. M. YYYY']; 

var multiDateValidator = function (value) 
{ 
    for(var dateFormat of allowedDateFormats) { 
    if (moment(value, dateFormat, true).isValid()) { 
     return true; 
    } 
    } 
    return false; 
}; 
+0

即使我改變了接受的答案後VincenzoC的一個,你的範圍解釋我的功能對我來說非常有用。謝謝。 –

+0

當然!我用了很多時間,並不知道你可以做到這一點沒有循環!太好了! – JapanGuy