我有一台webpack开发的服务器。在其中,我声明了一个包含一些数据的数组。在其中一个端点,我复制该数据,操作副本,然后返回副本。代码如下:
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)只在第一次调用时被调用。之后,它只使用copyOfData,这不是我想要做的。
我正在尝试让它存储原始数据,复制该数据。在复印件上做完我的工作,然后把复印件还回去。
发布于 2016-10-10 03:24:59
data.slice(0)将始终是数据数组中的第一个元素,因为它不是一个赋值函数。改为尝试将copyOfData赋值给data.shift()
发布于 2016-10-10 23:40:09
我想通了。这与array.slice()只产生一个浅层拷贝的事实有关。这实际上意味着,尽管这些数组不是===,但它们都引用了相同的对象。因此,当我修改副本中对象的历史记录时,它也会影响原始数组(因为它们都指向内存中的同一对象)。
为了解决这个问题,我不得不使用下面的代码来深拷贝数组:
let copyOfData = JSON.parse(JSON.stringify(data));
这不是webpack或node的问题,而是我对Array.prototype.slice()如何工作的误解。
https://stackoverflow.com/questions/39947509
复制相似问题