尝试了解Javascript中带有时刻库时间戳的地图

时间:2019-07-11 15:15:00

标签: javascript momentjs

我有以下代码来获取具有新时间戳记的对象列表。我正在使用momemt lib来更新时间。基本逻辑是循环N次并收集每次添加1分钟的时间列表。

var moment = require('moment');
var _ = require('lodash');
var startDate = moment("1995-12-25");

var currentDate = startDate;

var result = _.range(5).map(function () {
  const nextTimestamp = currentDate.add(60, 's');
  console.log('nextTimestamp: ' + JSON.stringify(nextTimestamp));
  currentDate = nextTimestamp;

  return {
    timestamp: nextTimestamp
  }
});

console.log('result: ' + JSON.stringify(result, null, 2));

我希望它将在时间戳上提供一个1分钟的差异数组。我看到的输出是:

nextTimestamp: "1995-12-25T06:01:00.000Z"
nextTimestamp: "1995-12-25T06:02:00.000Z"
nextTimestamp: "1995-12-25T06:03:00.000Z"
nextTimestamp: "1995-12-25T06:04:00.000Z"
nextTimestamp: "1995-12-25T06:05:00.000Z"
result: [
  {
    "timestamp": "1995-12-25T06:05:00.000Z"
  },
  {
    "timestamp": "1995-12-25T06:05:00.000Z"
  },
  {
    "timestamp": "1995-12-25T06:05:00.000Z"
  },
  {
    "timestamp": "1995-12-25T06:05:00.000Z"
  },
  {
    "timestamp": "1995-12-25T06:05:00.000Z"
  }
]

任何人都可以帮助我理解为什么所有数组元素的数组都带有最后一个时间戳。

谢谢。

3 个答案:

答案 0 :(得分:4)

之所以会发生这种情况,是因为您使用的是一个 currentDate对象,该对象一直在变异。即使将对象放入数组,它也不会因您在下一次迭代中所做的事情而发生突变。

您需要创建单独的对象,为此,您可以使用momentjs中可用的clone方法:

currentDate = nextTimestamp.clone();

或致电moment()

currentDate = moment(nextTimestamp);

答案 1 :(得分:3)

您的问题与map无关。

请参见documentation for moment

  

应该注意,时刻是可变的。调用任何一种操纵方法都会改变原始时刻。

数组中的每个条目都是对相同时刻的引用,您只需反复修改其值即可。

每次添加时间时,您都需要使用一个时刻对象(可以通过clone()添加一个时刻对象):

var startDate = moment("1995-12-25");
var nextTimestamp = startDate;

var result = _.range(5).map(function () {
  nextTimestamp = nextTimestamp.clone().add(60, 's');
  console.log('nextTimestamp: ' + JSON.stringify(nextTimestamp));
  return {
    timestamp: nextTimestamp
  }
});

答案 2 :(得分:0)

Array.map函数返回一个新数组,其结果等于将给定函数应用于数组中的每个元素。同样,您没有获得任何更改它们的元素。 Map接受了需要更改的当前元素的参数。

 //I didn't use lodash but the theory is the same 
 var range = [0, 1, 2, 3, 4, 5];  
 var result = range.map(function (element) {
    return element += 1;
 });

 console.log(result); //1, 2, 3, 4, 5, 6