我正在尝试找到生成具有以下输出的数组的最佳方法:
[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中加载值并加载它们?
您怎么看?预先感谢
答案 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