首页 > 解决方案 > Javascript循环检测一系列最少三个相同数字何时开始或结束

问题描述

我有一个看起来像这样的对象数组:

let data = [
  {timestamp: "2020-09-23T14:01:59.425Z", value: 5.12002},
  {timestamp: "2020-09-24T20:02:20.656Z", value: 3.13285},
  {timestamp: "2020-09-24T21:02:28.307Z", value: 2.84637},
  {timestamp: "2020-09-24T22:04:09.648Z", value: 3.57281},
  {timestamp: "2020-09-24T23:02:10.257Z", value: 10},
  {timestamp: "2020-09-25T04:00:54.857Z", value: 10},
  {timestamp: "2020-09-25T05:01:47.202Z", value: 10},
  {timestamp: "2020-09-25T06:02:27.773Z", value: 10},
  {timestamp: "2020-09-25T07:01:43.621Z", value: 10},
  {timestamp: "2020-09-25T08:01:07.918Z", value: 10},
  {timestamp: "2020-09-25T09:02:48.843Z", value: 5.2812},
  {timestamp: "2020-09-25T10:02:44.509Z", value: 10},
  {timestamp: "2020-09-25T11:01:47.002Z", value: 10},
  {timestamp: "2020-09-25T12:02:46.718Z", value: 10},
  {timestamp: "2020-09-25T13:00:32.164Z", value: 10},
  {timestamp: "2020-09-28T05:02:44.037Z", value: 10},
  {timestamp: "2020-09-28T14:01:57.837Z", value: 10},
  {timestamp: "2020-09-29T11:01:34.661Z", value: null},
  {timestamp: "2020-09-29T17:02:20.367Z", value: null},
  {timestamp: "2020-09-29T18:02:23.282Z", value: 8.49232},
  {timestamp: "2020-09-29T19:00:39.818Z", value: 7.38261},
  {timestamp: "2020-09-30T03:01:49.720Z", value: 6.28182},
  {timestamp: "2020-09-30T05:01:35.621Z", value: null},
  {timestamp: "2020-09-30T06:00:27.023Z", value: null},
  {timestamp: "2020-09-30T07:03:00.132Z", value: null}
];

我想创建一个函数,该函数循环遍历该数组并返回所有以一系列最小三个较低(<10)或空值结束的条目,同时开始一系列(最小)三个较高值(10)。这也应该反过来工作(返回结束一系列三个较高值(10)的条目,同时开始连续三个较低或空值。)

在上面的示例中,所需的输出应该是一个包含以下两个对象的数组:

{timestamp: "2020-09-24T23:02:10.257Z", value: 10},
{timestamp: "2020-09-29T11:01:34.661Z", value: null}

到目前为止,已经提出了以下功能,但仍然不完整且不起作用。我是 javascript 编码的新手,所以非常感谢一些帮助

jfdetection = () => {
  let result = [];
  let count = 0;
  for (let i = 0; i < data.length; i++) {
    if (count === 3 && data.value === 10) {
      result.push(data)
      count = 0
    } else {
      if (data.value < 10) count ++
      else if (data.value === 10) count = 0
    }
   return result;
}}

标签: javascriptarraysfunctionloops

解决方案


与 Ben 的想法类似,您可以将整个输入映射到一个字符串,其中每个字符对应一个条目。然后使用正则表达式查找您要查找的模式的所有出现:

const regex = /000(?=111)|111(?=000)/g;
const peeks = (data) => Array.from(
    data.map(({value}) => "01"[+(value === 10)]).join("").matchAll(regex),
    match => data[match.index+3]
);

// demo
const data = [ {timestamp: "2020-09-23T14:01:59.425Z", value: 5.12002}, {timestamp: "2020-09-24T20:02:20.656Z", value: 3.13285}, {timestamp: "2020-09-24T21:02:28.307Z", value: 2.84637}, {timestamp: "2020-09-24T22:04:09.648Z", value: 3.57281}, {timestamp: "2020-09-24T23:02:10.257Z", value: 10}, {timestamp: "2020-09-25T04:00:54.857Z", value: 10}, {timestamp: "2020-09-25T05:01:47.202Z", value: 10}, {timestamp: "2020-09-25T06:02:27.773Z", value: 10}, {timestamp: "2020-09-25T07:01:43.621Z", value: 10}, {timestamp: "2020-09-25T08:01:07.918Z", value: 10}, {timestamp: "2020-09-25T09:02:48.843Z", value: 5.2812}, {timestamp: "2020-09-25T10:02:44.509Z", value: 10}, {timestamp: "2020-09-25T11:01:47.002Z", value: 10}, {timestamp: "2020-09-25T12:02:46.718Z", value: 10}, {timestamp: "2020-09-25T13:00:32.164Z", value: 10}, {timestamp: "2020-09-28T05:02:44.037Z", value: 10}, {timestamp: "2020-09-28T14:01:57.837Z", value: 10}, {timestamp: "2020-09-29T11:01:34.661Z", value: null}, {timestamp: "2020-09-29T17:02:20.367Z", value: null}, {timestamp: "2020-09-29T18:02:23.282Z", value: 8.49232}, {timestamp: "2020-09-29T19:00:39.818Z", value: 7.38261}, {timestamp: "2020-09-30T03:01:49.720Z", value: 6.28182}, {timestamp: "2020-09-30T05:01:35.621Z", value: null}, {timestamp: "2020-09-30T06:00:27.023Z", value: null}, {timestamp: "2020-09-30T07:03:00.132Z", value: null} ]

console.log(peeks(data))


推荐阅读