在一定范围内创建动态数组

时间:2020-03-22 00:58:26

标签: javascript arrays ecmascript-6

我正在尝试找到生成具有以下输出的数组的最佳方法:

[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] );

        }

此数组的目的是拥有一组值,这些值将帮助我识别某个滚动位置以执行功能,即使用户滚动,此间隔的添加也将有助于我确定滚动位置快速。

也许我可以在.json中加载值并加载它们?

您怎么看?预先感谢

2 个答案:

答案 0 :(得分:1)

一旦创建了一个中心值数组(例如[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);

答案 1 :(得分:1)

因此,如果您真正想做的就是能够测试数字是否在前哨倍数的5内,那么我不认为您真的想生成一个巨型数组并使用{{1 }}。那太慢了。如果要预生成值,则应使用.includes(),然后使用Set,对于大量数据,它应比.has()快得多。


但是,似乎您可以进行很多计算而无需进行任何预生成。

在下面的代码中,我们除以倍数(140),然后查看余数。如果余数是<= 5或> = 135,则它在倍数的5以内,否则就不在。真的就是这么简单。由于您似乎不希望数字0-5(在零倍附近)被计为.includes(),因此我们为它们添加了一种特殊情况。

true