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));
});
}
我的项目使用 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));
});
}