【问题标题】:MomentJS - a cleaner way of getting an hourly price in the past 24 hoursMomentJS - 在过去 24 小时内获得每小时价格的更清洁方法
【发布时间】:2018-10-01 20:57:33
【问题描述】:

提前感谢所有帮助。我会尽量描述这一点。

我要做的是从包含每分钟更新的价格的数组中获取价格列表。具体来说,我想要过去 24 小时内每小时的每个价格的列表。因此,一天 24 个价格有效。每个价格都有一个时间戳,所以我使用 momentJS isBeforeisAfter 来缩小搜索范围。

下面的代码显示了我如何从过去两个小时中获取所需的数据。这工作正常。但是我觉得复制这 24 次是不对的。一个循环应该能够给我我需要的东西,但是我不确定如何实现它。非常感谢您的帮助。如果我没有很好地描述这个问题,我很抱歉

const lastHourArray = [];
    const lastHourArray2 = [];
    lodash.forEach(tickerHistoryData, (data) => {
        const dateNow = moment();
        const prevHour = moment().subtract(1, 'hours');
        const prevTwoHours = moment().subtract(2, 'hours');
        const instanceDate = moment(data[0]);
        const isItAnHourAgo = instanceDate.isBefore(dateNow) && instanceDate.isAfter(prevHour);
        const isItTwoHoursAgo = instanceDate.isBefore(prevHour) && instanceDate.isAfter(prevTwoHours);

        if (isItAnHourAgo) {
            const hourObject = {
                hour: 1,
                price: data[4],
            };
            lastHourArray.push(hourObject);
        }
        if (isItTwoHoursAgo) {
            const hourObject2 = {
                hour: 2,
                price: data[4],
            };
            lastHourArray2.push(hourObject2);
        }
    });
    tickerInstruments[findInstrument.productSymbol].hourlyPrice.push(lastHourArray[lastHourArray.length - 1]);
    tickers[findInstrument.name].hourlyPrice.push(lastHourArray[lastHourArray.length - 1]);
    tickerInstruments[findInstrument.productSymbol].hourlyPrice.push(lastHourArray2[lastHourArray2.length - 1]);
    tickers[findInstrument.name].hourlyPrice.push(lastHourArray2[lastHourArray2.length - 1]);

【问题讨论】:

    标签: javascript arrays object for-loop momentjs


    【解决方案1】:

    lodash.forEach(tickerHistoryData, (data) => {
      const dateNow = moment();
      const instanceDate = moment(data[0]);
    
      for (let i = 1; i <= 24; i++) {
        const prevHour = moment().subtract(i, 'hours');
        const isItAnHourAgo = instanceDate.isBefore(dateNow) && instanceDate.isAfter(prevHour);
    
        if (isItAnHourAgo) {
          const hourObject = {
            hour: i,
            price: data[4],
          };
          lastHourArray.push(hourObject);
        }
      }
    });

    你能试试这行得通吗? 对于tickerHistoryData 中的每个data,它将循环24 次并检查时间。

    如果您需要检查 0 到 23 小时之间的时间,请像这样修复 for 循环 (let i = 0; i &lt; 24; i++)

    【讨论】:

    • 感谢您的回复!我认为它非常接近!我认为为什么对我来说出错是因为在 forEach 中有一个 for 循环。我想知道我是否只需要扩展原来的 forEach
    • 好吧,如果您需要检查 data 的每个实例 24 小时,那么您将需要在另一个循环中循环,不确定您的数据结构如何。如果不是这种情况,如果每个data 代表每小时你可以这样做jsfiddle.net/bzcwxq08 它只使用来自forEach 循环的索引
    • 再次感谢!我确实做了一点改变,jsfiddle.net/wfnt7946 正如你所看到的,我将 dateNow 设置为每次都减去 i,因为我正在寻找一个特定的值,而不是一个范围。目前,这对我来说适用于两个循环,但 isItAnHourAgo 在第三次迭代时返回 false。我不确定为什么时间戳是正确的
    • const dateNow = moment().subtract(i - 1, 'hours'); const prevHour = moment().subtract(i, 'hours');也许你需要切换这两个,prevHour不应该是i - 1dateNow只是i吗?
    • 是的,你是对的。我现在让它按照我想要的方式工作。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2016-10-08
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多