简介
ndarray-tile 是一个能够快速、高效地重复 ndarray 数组的 npm 包。它的内部机制采用底层的二进制数组实现,可以实现在内存中复制并扩大任意大小的数组。在前端中使用它可以提高页面的性能表现,对于一些数据密集型的应用,也能够提高代码的可读性和可维护性。
安装
使用 npm 安装:
npm install ndarray-tile
示例代码
下面是一个简单的示例用法:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---- - ------------------------ -- ---- --- ----- ----- ------ - ----------- ---------------------------------- ------- -- ---------- --- - ----- --------- - ------------ ------- -- --------- -----------------------
输出结果:
[ [ 1, 1, 2, 2, 3, 3 ], [ 1, 1, 2, 2, 3, 3 ], [ 4, 4, 5, 5, 6, 6 ], [ 4, 4, 5, 5, 6, 6 ], [ 7, 7, 8, 8, 9, 9 ], [ 7, 7, 8, 8, 9, 9 ] ]
详解
参数介绍
tile 函数接收两个参数,第一个参数是需要被重复的数组,第二个参数是一个数组,代表了各个维度的重复倍数。
tile(array, repeats)
其中,array
可以是任何类型的 ndarray 数组,repeats
是一个长度为 array.shape.length 的数组,每个元素都是一个代表此纬度重复的次数。
原理
当调用 tile
函数是,该函数会返回一个传入的输入数组对象的构造函数。这个构造函数叫 arrayConstructor,它通过数据句柄和形状创建了一个 ndarray 对象,期间使用了装饰器。data 数据代表的是输入的 array 中的内存数据。
如果需要重复一维数组(其中,原生的 slice 方法会进行拷贝,对应 O(N2) 的时间复杂度),我们需要重复相同数量的行。这很简单:只需相加该行之后,再利用 constructor 重复即可。
如果需要重复多维数组,我们可以简单地使用一个 forEach 循环来访问每个父级数组并重复它们。在这个 forEach 循环中,我们需要创建一个子函数,该函数将串联所有内部数据并将其存储在一个中间数组中。
为了在新数组中保存此信息,我们需要遍历新数组的每一个行,并将重复的行放在正确的位置上。这是由 toRepShape 函数完成的。
为了实现高性能的重复算法,ndarray-tile 的作者利用了 JavaScript 和底层二进制数组的优势。具体而言,他将所有循环变量展开为直接观察内在数据排列的枚举。这种优化流程通常被称为运行-时展开。
学习意义
JavaScript 中的数组重复操作是一个常见的需求,而 ndarray-tile 这个npm 包就提供了一个高效、灵活的解决方案。学习使用这个 npm 包不仅可以提高前端编程的技巧,更重要的是可以提升代码效率和性能,并为将来开发数据结构和算法相关的应用提供基础知识。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5eedcc99b5cbfe1ea061281c