首页 > 解决方案 > 为什么控制台显示所有元素,但长度为 0

问题描述

在我的代码中,我使用 AJAX 来填充一个数组,这很好用,但是当我在它给出 0 之外使用长度时。

看看这段代码,评论会告诉你我的意思。

$.ajax({
        url: "url",
        type : "GET",
        //contentType: "application/json",
        //dataType: "json",
        data : { firstDate : "date1",
                secondDate : "date2"}
                    //student_name : $('#id_student_name').val()
    }).then(function(data) {

        var obj = JSON.parse(data);
        obj.results.forEach(element => {
            console.log(element.DATEEND); 
            res.push(element);
            dates.push(element.DATESTART);
        });

    });
    var days = ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'];
    var i;

    function min_date(all_dates) {
        var min_dt = all_dates[0],
        min_dtObj = new Date(all_dates[0]);
        all_dates.forEach(function(dt, index){
            if ( new Date( dt ) < min_dtObj)
            {
                min_dt = dt;
                min_dtObj = new Date(dt);
            }
        });
        return min_dt;
    }

    var d = [];
    console.log(res.length + "    "); // this give 0
    for (var a = 0; a < res.length; a++) {
        d[a] = res[a].DATESTART;
        console.log(res[a].DATESTART);
    }
    console.log(d);//this is vide

    console.log(res); //this give all element

.
.
.

标签: javascriptjquery

解决方案


如果您将无原始元素记录到控制台,则将存储其引用以进行记录。因此,控制台中显示的内容可能会反映对象的较晚状态,然后是您进行日志记录时的状态。

在没有任何异步代码的情况下,这个小提琴将具有相同的行为:

var a = []
console.dir(a.length)
console.dir(a) // the array a does not have any elements a the time 
               // you do the logging but the console will show an
               // array with 10 elements
for (var i = 0; i < 10; i++) {
  a.push(1)
}

您甚至可以将其扩展到这样的示例:

var a = []
console.dir(a.length)
console.dir(a)
for (var i = 0; i < 4; i++) {
  a.push(1)
}
console.dir(a)
for (var i = 0; i < 4; i++) {
  a.push(2)
}

两个日志都将显示元素的最新状态,而不是记录它的状态。因此,如果您想查看元素所包含的实际值,您需要在日志记录之后立即添加断点或debugger语句。或者您需要将对象转换为字符串。


推荐阅读