我有一个webpack开发服务器。在其中我声明了一个包含一些数据的数组。在其中一个端点中,我复制该数据,操作副本,然后返回副本。这是代码:
grep
问题是,在第一次请求之后,我的事件历史记录为零,即使数据中的事件应与筛选条件匹配。据我所知,const data = [{
title: 'Title 1',
history: [{startTime: 1}, {startTime:5}]
},
{
title: 'Title 2',
history: [{startTime:3}, {startTime:7}]
}];
module.exports = () => {
app.use(send.json())
.use(connectRoute(function (router) {
router.get('endPoint/:fromDate/:toDate', function(req, res, next){
let copyOfData = data.slice(0);
copyOfData.forEach((dataPoint)=>{
let startTime = moment(req.params.fromDate,'X');
let endTime = moment(req.params.toDate,'X');
let filteredHistory = dataPoint.history.filter((event)=>{
let eventTime = moment(event.startTime, 'X');
return (eventTime.isAfter(startTime) && eventTime.isBefore(startTime));
});
});
res.end(res.json(copyOfWorkflows));
}
}
}
仅在第一次被调用。之后它只使用data.slice(0)
,这不是我想做的。
我试图让它存储原始数据,复制该数据。在副本上完成我的工作,然后返回副本。
答案 0 :(得分:0)
data.slice(0)
将始终是数据数组中的第一个元素,因为它不是mutator。尝试将copyOfData分配给data.shift()而不是
答案 1 :(得分:0)
我想出来了。这与array.slice()
仅产生浅拷贝的事实有关。有效地意味着虽然数组不是===
,但它们都引用了相同的对象。因此,当我修改副本中对象的历史记录时,它也会影响原始数组(因为它们都指向内存中的同一对象)。
要解决此问题,我必须使用以下内容深度复制数组:
let copyOfData = JSON.parse(JSON.stringify(data));
这不是webpack或节点的问题,而是我对Array.prototype.slice()
如何工作的误解。