首页 > 解决方案 > 尽管 if (应该充当过滤器),但所有元素都推入数组

问题描述

我的 HTML 中有一个小表单,用于获取预订数据。对应的提交按钮与功能 ( saveReserve) 相关联。这个想法是该函数可以获取数据并将其推送到数组中,但也可以检测何时已经进行了类似的预订,因此如果是这种情况,则将新的保留排除在外(不要将其推送到数组中)与一个相似的)。

问题是所有保留都是推送,即使它们是相同的,忽略 IF 元素:

let allReservation = [];
var NR = 0

const saveReserve = () => {
    var date= $("#date").val();    //These are the form inputs//
    var hour= $("#hour").val();
    var gameRes = $("#reserveG").val();
    NR++

   
    var reservation = ({date, hour, gameRes})
    let exist = allReservation.find(e=> e.date == reservation.date && e.hour == reservation.hour && e.gameRes == reservation.gameRes);
    console.log(reservation, exist)
    
    if (exist == undefined) {
        allReservation.push( NR + ": " + $("#nameR").val() + Object.values(reservation) );
        alert ("All good")
    }else{   
      alert ("Invalid, try again")
    }

    //nameR is the name input in the form//


    console.log (allReservation)
    $("input").val('') 
}
$('[type="submit"]').click(saveReserve)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="date" value="2021-08-05" id="date" />
<input type="number" id="hour" min="0" max="23" value="7" />
<input type="text" id="reserveG" value="A" />
<input type="text" id="nameR" value="B" />
<input type="submit" />

let allReservation = [];
var NR = 0

const saveReserve = () => {
    var date= $("#date").val();    //These are the form inputs//
    var hour= $("#hour").val();
    var gameRes = $("#reserveG").val();
    NR++

   
    var reservation = ({date, hour, gameRes})
    let exist = allReservation.find(e=> e.date == reservation.date && e.hour == reservation.hour && e.gameRes == reservation.gameRes);
    
    if (exist == undefined) {
        allReservation.push( NR + ": " + $("#nameR").val() + Object.values(reservation) ),
        alert ("All good") )
    }else{   
      alert ("Invalid, try again")
    }

    //nameR is the name input in the form//


    console.log (allReservation)
    $("input").val('') 
}

.find 工作的唯一方法是如果我在函数末尾添加它:

allReservation.push (reservation)

然后它会识别重复元素并提醒它们,但也会将它们推入。

标签: javascriptjqueryarraysif-statement

解决方案


那么,如何使用 for 循环遍历所有保留并检查它是否在数组中。开始时,您的数组将为空,因此将添加第一个预订。下一个将检查当前的预留数组,如果它存在,则不要添加到它。有很多方法可以检查它是否存在于数组中。这里有一些例子来展示这些方法:

var num_array = [1, 2, 3, 4, 4]
var string_Array = ["a", "b", "c", "a", "b", "c"]
var obj_array = [ { index: 1, value: "a" }, { index: 2, value: "b" }, { index: 2, value: "b" } ]

var num_ourArray = [];
var string_ourArray = [];
var obj_ourArray = [];

//loop through number array
$.each(num_array, function(k, v){

   //first way to check
   if ($.inArray(v, num_ourArray) == -1) //so if it's NOT in the array
   {
      num_ourArray.push(v)
   }
   
   //second way to check
   /*if (num_ourArray.indexOf(v) == -1) //so if it's NOT in the array
   {
      num_ourArray.push(v)
   }*/
})

console.log(num_ourArray)

//loop through string array
$.each(string_Array, function(k, v){

   //first way to check
   if ($.inArray(v, string_ourArray) == -1) //so if it's NOT in the array
   {
      string_ourArray.push(v)
   }
})

console.log(string_ourArray)

//loop through object array
$.each(obj_array, function(k, v){

   //first way to check
   if (!obj_ourArray.some(item => item.index === v.index)) //so if it's NOT in the array
   {
      obj_ourArray.push(v)
   }
})

console.log(obj_ourArray)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


推荐阅读