将选定日期与MySQL查询生成的表列或日期数组进行比较

2022-03-23 00:00:00 arrays node.js javascript mysql ejs

我有一个如下所示的页面:

我尝试做的是将";Holiday Date:";选择与其下面表格中的";date";列中的行值进行比较。我尝试过使用这样的代码:

function dateChk(){
        var dt1 = document.getElementById('PHDate').value;
        var dt2 = document.getElementById('phdateadd').value;
            if (dt1 == dt2) {
               alert("This date already assigned, please try again.");
               document.getElementById('phdateadd').value = 0;
         }
 }

但这只适用于第一行。然后我想要做这样的数组:

<input id="phdateadd" name="phdateadd" type="date" onchange="myFunction()" required>

<p id="demo"></p>

<script>
var dates= ["2021-01-01", "2021-02-12", "2021-02-13", "2021-04-02", "2021-05-01", 
                        "2021-05-13", "2021-05-14", "2021-05-26", "2021-05-30", "2021-05-31", 
                        "2021-07-06", "2021-07-20", "2021-08-10", "2021-08-31", "2021-09-16", 
                        "2021-10-02", "2021-10-19", "2021-11-04", "2021-12-25"];

function checkDate(date) {
  return date == document.getElementById("phdateadd").value;
}

function myFunction() {
  document.getElementById("demo").innerHTML = dates.find(checkDate);
  var chk = document.getElementById("demo").innerHTML;
  
  if ( chk != "undefined" ) {
        alert("This date already assigned, please try again.");
        document.getElementById("phdateadd").value = 0;}
}
</script>

这确实有效,但是我必须将该列中的所有日期指定为数组。我的想法是从MySQL查询传递数据,日期值格式类似于数组,但它似乎无法识别。以下是查询:

SELECT CONCAT('["',GROUP_CONCAT(phdate SEPARATOR '", "'),'"]') As arrdate FROM table1;

which returns

["2021-01-01", "2021-02-12", "2021-02-13", "2021-04-02", "2021-05-01", "2021-05-13", "2021-05-14",
 "2021-05-26", "2021-05-30", "2021-05-31", "2021-07-06", "2021-07-20", "2021-08-10", "2021-08-31",
 "2021-09-16", "2021-10-02", "2021-10-19", "2021-11-04", "2021-12-25"]

因此,我将结果显示在页面中:

<% phDates.forEach((phDates, index) => { %>
        <tr><td><p id="phdates" name="phdates" value="<%= phDates.arrdate %>"><%= phDates.arrdate %>
            <% }) %></p><p id="demo" name="demo">b</p><br><p id="demo1" name="demo1">a</p></td></tr>

<script>
var dates = document.getElementById("phdates").innerHTML;
        document.getElementById("demo").innerHTML = dates;
</script>

如您所见,来自MySQL查询的arrdate值和demo显示的格式相似。当我在var dates中指定数组时,demo值是不同的(如上面的代码片断所示):

如果我故意让MySQL如上所述返回数据,尽管它仍然无法识别数据。我认为如果这种方法可行,我甚至不需要将选择的日期与表中的列进行比较。我使用$( "div" ).toArray()进行了测试,但也无法使其工作。

我认为这对我来说可能是最简单的解决方案,但我想知道如何格式化MySQL结果值,使其与正确的javascript数组格式相对应?或者保持MySQL输出不变,并将该值转换为JavaScript数组兼容值。我不禁想到解决方案可能很简单,但我已经找了几天了,但什么都没有找到。


解决方案

实际上有一个简单的解决方案。让我们从您的查询开始我们的思考过程,它离解决方案不是很远(这还不是很好,但已经很接近了-足以开始我们的思考过程):

SELECT CONCAT('["',GROUP_CONCAT(phdate SEPARATOR '", "'),'"]') As arrdate FROM table1;
您打算在这里将数据转换为类似JSON的字符串。当然,您可以调用JSON.parseeval并对此结果赋值,但我推荐一种更优雅的方式:

SELECT GROUP_CONCAT(phdate SEPARATOR ',') As dates FROM table1;
上面将包含一个日期用逗号分隔的字符串。假设您将其放入名为myDates的JS变量中,您只需调用:

myDates.split(",")
let myDates = '2021-01-13,2021-02-02,2021-03-04'; //results from db

console.log(myDates.split(','));

相关文章