Как я могу использовать loda sh, чтобы найти запись с ближайшей отметкой времени? - PullRequest
1 голос
/ 08 мая 2020

Я новичок в loda sh и хотел бы использовать его, чтобы найти индекс объекта в наборе данных, который содержит метку времени, ближайшую к заданному значению timestamp / x.

Скажем, я с меткой времени var timestamp = "2019-01-01 01:01:30".

И мой набор данных выглядит так:

dataset = [{
    x: "2019-01-01 00:01:38",
    y: 1
  },
  {
    x: "2019-01-01 01:01:39",
    y: 5
  },
  {
    x: "2019-01-01 02:01:40",
    y: 4
  },
  {
    x: "2019-01-01 03:01:41",
    y: 1
  }
]

Я бы хотел, чтобы он возвращался мне либо: индекс набора данных, который содержит ближайшую временную метку (в данном случае это 1, поскольку метка времени в индексе 1 является ближайшей)

ИЛИ

Я хотел бы, чтобы он возвращал значение y записи в индексе, который содержит ближайшее значение timestamp / x (которое было бы 5 ). Возврат всей записи тоже подойдет. Просто какой-то способ получить доступ к значению y.

Какой метод loda sh идеально подходит для этого, и как я go могу его построить?

Что-то с использованием .filter или .find, возможно?

_.find(dataset, function(item) {
  return ...?
  );
})

Большое спасибо за ваш вклад!

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Вы можете найти метку времени вот так. Я предполагаю, что метки времени не относятся к одному и тому же дню.

const currentDate = new Date('2019-01-01 01:01:30');
const currentSeconds = (currentDate.getHours() * 60) + (currentDate.getMinutes() * 60) + currentDate.getSeconds();
const dates = _.map(dataset, set => {
    const date = new Date(set.x);
    if (date.getDate === currentDate.getDate && date.getMonth === currentDate.getMonth && date.getFullYear === date.getFullYear) {
        const setInSeconds = (date.getHours() * 60) + (date.getMinutes() * 60) + date.getSeconds();

        return {
            x: set.x,
            y: set.y,
            difference: Math.abs(setInSeconds - currentSeconds)
        };
    }
});
const closestDate = _.minBy(dates, 'difference');
console.log(closestDate);
0 голосов
/ 08 мая 2020

Вы можете использовать Array.reduce() или loda sh s _.reduce(), чтобы перебрать массив и найти разницу между x и timestamp. Сохраните разницу и значение y, если оно меньше. Уничтожьте результат, чтобы получить значение y.

Cal c the diff, взяв абсолютную разницу между проанализированными значениями.

const timestamp = "2019-01-01 01:01:30"

const dataset = [{"x":"2019-01-01 00:01:38","y":1},{"x":"2019-01-01 01:01:39","y":5},{"x":"2019-01-01 02:01:40","y":4},{"x":"2019-01-01 03:01:41","y":1}]

const [y] = dataset.reduce((r, { x, y }) => {
  const diff = Math.abs(Date.parse(timestamp) - Date.parse(x))

  return diff < r[1] ? [y, diff] : r
}, [null, Infinity])

console.log(y)
...