【发布时间】:2014-01-29 20:27:56
【问题描述】:
我有一个无法完全解决的问题。
var records = dataView.getItems();
for (var i = 0; i < records.length; i++) {
var date = records[i].RecordCreated;
records[i].RecordCreated = new Date(parseInt(date.replace('/Date(', '')));
}
records = JSON.stringify(records);
这是一个小循环,它从 SlickGrid 数据视图中获取现有数据并将 /Date(###)/ 格式转换为适当的日期格式,以便在服务器上进行反序列化。这很好用。
奇怪的问题是var records = dataView.getItems(); 定义更像是一个引用,而不是一个单独的、唯一的对象。考虑以下代码:
var records = dataView.getItems();
// Debug Code [A]
console.log(records);
console.log(dataView.getItems());
for (var i = 0; i < records.length; i++) {
var date = records[i].RecordCreated;
records[i].RecordCreated = new Date(parseInt(date.replace('/Date(', '')));
}
// Debug Code [B]
console.log(records);
console.log(dataView.getItems());
records = JSON.stringify(records);
[B] 处的控制台日志都是相同的,但人们会认为它们会有所不同。意思不是看到第二个日志没有更改 /Date(###)/ 格式日期,而是打印正确的日期对象。
更奇怪的是,在 [A] 处,控制台日志正在打印,就好像循环异步运行并在调用 console.log() 命令之前完成。
这一切都包含在一个函数中,其中包含一些条件语句来执行不同的循环,这并不疯狂。我需要知道的是records 定义如何/为什么不能正常工作(内存中的一个唯一变量,可以在不影响原始对象的情况下进行编辑)。
解决方案
所以问题是记录从 SlickGrid 库接收原始对象。我解决此问题的方法是在将对象分配给记录之前对其进行克隆。
克隆功能:
function clone(obj) {
if (obj == null || typeof (obj) != 'object')
return obj;
var temp = new obj.constructor();
for (var key in obj)
temp[key] = clone(obj[key]);
return temp;
}
用法:
var __data = dataView.getItems();
records = clone(__data);
希望这对以后查看此问题的其他人有所帮助。
【问题讨论】:
-
当您在控制台中展开这些记录的数组时,您是否看到一条消息“第一次展开时捕获下面的对象状态”?
-
@DCoder 这会在原型扩展中的某个地方吗?我在预期对象的展开视图中的任何地方都没有看到该消息。
-
它通常显示为对象旁边的蓝色“i”图标,但在这种情况下,这不是真正的问题。根据 SlickGrid 的来源,Caleb 的回答是正确的。
标签: javascript variables syntax reference slickgrid