Создать массив Dynami c в пределах определенных значений диапазона - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь найти лучший способ создать массив, который имеет следующий вывод:

[135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 275, 276, 277 , 278, 279, 280, 281, 282, 283, 284, 285, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 675, 676, 677, 678, 679, 700, 701, 702, 703, 704, 705 ...

Как вы можете видеть, он имеет набор ограничений от 140 - 280 - 420 - 560 - 700 (добавляет 148 к каждому значению), а затем есть интервал с минус 5 и плюс 5 для каждого значения.

Я уже пробовал этот подход

scrollFrom =  Array.from(Array(bytesIndexTo).keys()).map(i => 140 + i * 140);

Это возвращает меня:

[140, 280, 420, 560, 700, ...

Однако мне также нужны интервалы значений плюс и минус 5 ...

Я также заметил, что он использует много ресурсов.

        const prev = [
            [135,136,137,138,139],
            [275,276,277,278,279],
        ];

        const after = [
            [141,142,143,144,145],
            [281,282,283,284,285],
        ];

        for (let i = 0; i < scrollFrom.length; i++) {

            scrollFrom.push( scrollFrom[i] );

        }

Цель этого массива состоит в том, чтобы Имея набор значений, которые помогут мне определить определенную позицию прокрутки для выполнения функции, добавление этих интервалов поможет мне определить положение прокрутки, даже если пользователь выполняет быструю прокрутку.

Может быть, я мог бы загрузить значения внутри a. json и загрузить их?

Что ты думаешь? заранее спасибо

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Итак, если вы все, что вы действительно хотите сделать, это иметь возможность проверить, находится ли число в пределах 5 от кратного, то я не думаю, что вы действительно хотите генерировать гигантский массив и использовать .includes() , Это было бы медленно. Если вы собираетесь предварительно сгенерировать значения, вы должны использовать Set, а затем использовать .has(), что должно быть намного быстрее, чем .includes() для большого набора данных.


Но, похоже, вы можете просто вычислить намного быстрее, не выполняя предварительную генерацию вообще.

В приведенном ниже коде мы делим на кратное (140), а затем смотрим на остаток. Если остаток равен <= 5 или> = 135, то он находится в пределах 5 от кратного, иначе нет. Это действительно так просто. Поскольку кажется, что вы не хотите, чтобы числа 0-5 (вокруг нулевого кратного) учитывались как true, мы добавляем специальный случай для них.

// tests to see if a value is within 5 of a multiple of 140
const multiple = 140;
const over = 5;
const below = multiple - over;

function testValue(val) {
    if (val < below) return false;
    const delta = val % multiple;                // divide by multiple, get remainder
    return (delta <= over || delta >= below);  // see if remainder in right range
}

// run some tests on numbers at edges of the interval ranges
[
    0, 1, 
    134, 135, 140, 144, 145, 146,   // around 140
    274, 275, 280, 284, 285, 286,   // around 280
    414, 415, 420, 424, 425, 426,   // around 420
    554, 555, 560, 564, 565, 566    // around 560
].forEach(num => {
    console.log(`${num}: ${testValue(num)}`);
});
1 голос
/ 22 марта 2020

После создания массива центральных значений (например, [140, 280, 420, 560, 700]) вы можете использовать flatMap для итерации по каждому элементу и создания другого массива из 5 значений ниже и выше него:

const bytesIndexTo = 4;
const result = Array.from(
  { length: bytesIndexTo },
  (_, i) => (i + 1) * 140
)
  .flatMap(num => Array.from(
    { length: 11 },
    (_, j) => num - 5 + j
  ));
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...