Javascript 数组在 JSON.stringify 中使用时为空

Javascript array is empty when used in JSON.stringify

我的项目使用 Dev Extreme 及其数据网格组件。此数据网格向我的用户显示数据,他们可以在其中 select 数据网格上的各个行并通过 API 调用将它们传递到我的后端。

在 API 调用中,我需要传递一组值,这些值是我从 selected 的任何行中收集的。当我将数组输出到控制台时,一切都如我所料。然而,当我将它放在 JSON.stringify() 中时,数组是空的。

为什么会这样?正如我所期望的那样,结果如下:{ 'LoadContextIds': [1,2,3], "ReportingCobid": "20190119"}

我上面的逻辑是这样的:

function runBatchWithLoadContexts() {
    var data = [];

    getDataGridInstance().getSelectedRowsData().done(function (rowData) {
        for (var i = 0; i < rowData.length; i++) {
            data.push(rowData[i].LoadContextId);
        }
    });

    var obj = { 'LoadContextIds': data, "ReportingCobid": cobDate };
    console.log(data);
    console.log(JSON.stringify(obj));

}  

附件是我的 console.log 中的一个片段,也显示了上述结果。最上面一行是`data'的输出格式,最下面是字符串化后的结果。

据我所知(通过简要浏览 devexterme 文档),.done 是异步的。所以你的 for 循环执行,data 数组被填充,after 你的控制台日志。这解释了为什么 console.log(JSON.stringify(obj)); 显示一个空数组。

但是,控制台日志实际上会打印实时对象,这些对象可以随着对象本身的更新而更新。这解释了为什么 console.log(data); 打印一个非空数组。

我敢打赌,如果您添加 console.log(JSON.stringify(data)),那也将是一个空数组。

@junvar 所说的一切都是正确的,如果您在 for 循环之后在 done 函数中创建 obj,那么所有数据都将在那里。

函数 runBatchWithLoadContexts() { 变量数据 = [];

getDataGridInstance().getSelectedRowsData().done(function (rowData) {
    for (var i = 0; i < rowData.length; i++) {
        data.push(rowData[i].LoadContextId);
    }
    let obj = { 'LoadContextIds': data, "ReportingCobid": cobDate };
    console.log(data);
    console.log(JSON.stringify(obj));
});

}