我有一个简单的对象
var errors = {};
我正在向其中动态推送新值,如下所示:
function getNameById(id){
return usersArray.find(item => item.id === id).name;
}
var usersArray = [
{"id":"135","name":"Jenny"},
{"id":"162","name":"Kelly"}
];
$("#submit").click(function (e) {
var errors = {};
$(".validation").each(function(){
var worker_id = $(this).attr('id').replace(/[^\d]/g, '');
var w_name = getNameById(worker_id);
errors[w_name] = [];
if ( $(this).val() == "" ) {
errors[w_name].push( $(this).attr('id').replace(/[^a-zA-Z]/g, '') + " must be filled!");
//errors[w_name].push("second number must be smaller than first");
}
if ( $(this).attr('id') == "second-"+worker_id && ($(this).val() < $('#first-'+worker_id+'').val())) {
errors[w_name].push("second number must be smaller than first");
}
});
console.log(errors);
e.preventDefault();
e.stopPropagation();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form method="post">
First<input id="first-135" class="validation" name="first" type="text" value="5"><br>
Second<input id="second-135" class="validation" name="second" type="text" value="8"><br>
Signature<input id="signature-135" class="validation" name="signature" type="text"><br>
<input id="submit" type="submit" value="Submit">
</form>
第一次在第一个 IF 条件下它会推送,一切都很好,但在第二个 IF 下它不会推送,我没有收到任何错误消息。在第一次评论后,我有相同的行,如果我将其注释掉,它就会像第一个一样被推送。
我在FIDDLE上创建了一个片段因此,请转到检查并打开控制台并尝试提交,您将看到错误数组中只有一个插入。
为什么第二个没有推送到数组?
最佳答案
问题出在这里:
if ( ... ($(this).val() < $('#first-'+worker_id+'').val()))
.val()
计算结果为字符串,并且任何时候您使用像 <
这样的相对运算符或>
对于字符串,它按字母顺序比较它们。这可能会导致一些意外的结果,返回 true
当你期望false
,反之亦然。
因为您提到这些应该是日期,所以您需要使用 Date.parse()
将它们转换为日期对象。 - 当然,假设它们采用 JS 可以解析的正确日期格式:
var d1 = Date.parse($(this).val());
var d2 = Date.parse($('#first-'+worker_id+'').val());
if (d1 < d2) {
//first date is earlier than second date
}
关于javascript - 无法两次推送到同一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42813079/