我有一个问题,我无法完全理解。
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(###)/ format转换为正确的日期格式,以便在服务器上反序列化。这很好。
奇怪的问题是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]处的控制台日志都是相同的,人们会期望它们不同。意思是代替看到第二个日志没有更改/日期(###)/格式日期,正在打印正确的日期对象。
更奇怪的是,在[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);
希望这有助于将来查看此问题的其他人。
答案 0 :(得分:3)
看起来records
变量是从dataView.getItems()
返回的数组。此变量是对数组对象的引用,因此更改该对象上的内容将反映在对象的所有引用中。
答案 1 :(得分:1)
您应确保dataView.getItems()
对正在返回的任何集合调用Array.protototype.slice