在前端开发中,排序是非常常见,且重要的操作之一。而 npm 包 merge-sorted
就是一款专门用来对已经排序好的数组进行合并操作的工具库。在本篇文章中,将详细介绍如何使用该库和实现的原理。
安装
安装 merge-sorted
很简单,只需要在终端中执行下面命令即可:
npm install merge-sorted
基本使用
mergeSorted(left, right, [comparator])
该函数接受三个参数:两个已经排好序的数组 left
和 right
,以及一个可选的比较器函数 comparator
。
下面是一个最基本的用法,将两个长度为 3 的已排序的数组合并:
const mergeSorted = require('merge-sorted'); const left = [1, 3, 5]; const right = [2, 4, 6]; const result = mergeSorted(left, right); console.log(result); // [1, 2, 3, 4, 5, 6]
在以上示例中,未传入第三个比较器函数参数,会默认用 >=
运算符进行比较。所以结果中数组已经按照从小到大的顺序排好了。
使用自定义比较器函数进行合并
如果你想让两个不同类型的可比较值组成的数组按照不同的顺序进行排序,或者根据元素内部的某些属性或函数类型,merge-sorted
库就需要传入自定义的比较器函数来正确执行合并操作。下面是一个示例,按照姓名排列一个包含 Person
对象的数组:
-- -------------------- ---- ------- ----- ----------- - ------------------------ ----- ------ - ----------------- ---- - --------- - ----- -------- - ---- - - ----- ---------- - --- -- -- ----------------------------- ----- ---- - ---- -------------- ---- --- --------------- ---- --- ----------------- ----- ----- ----- - ---- --------------- ---- --- -------------- ---- --- ----------------- ----- ----- ------ - ----------------- ------ ------------ -------------------- -- -- ----- ------- ---- -- -- - ----- -------- ---- -- -- - ----- ---------- ---- -- -- - ----- -------- ---- -- -- - ----- ------- ---- -- -- - ----- ---------- ---- -- --
在上述示例中,我们创建了一个自定义的排序器函数 comparator
,它会接受两个 Person
的实例,然后通过比较它们的姓名属性来返回大于 0 的整数,使得弗兰边的值排在后面。
进阶使用
同时合并多个已排序的数组
当需要同时将多个已排序的数组合并的时候,你可以使用 mergeSorted.all(arrays, [comparator])
函数。
下面是一个使用 mergeSorted.all()
的示例:
const mergeSorted = require('merge-sorted'); const array1 = [0, 2, 4]; const array2 = [1, 3, 5]; const array3 = [6, 7, 8, 9]; const result = mergeSorted.all([array1, array2, array3]); console.log(result); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
倒序合并数组
当你需要倒序合并两个已排序的数组时,你可以使用 mergeSorted.reverse(left, right, [comparator])
函数。
下面是一个示例,将两个已排序的数组倒序合并:
const mergeSorted = require('merge-sorted'); const left = [5, 4, 2]; const right = [3, 2, 1]; const result = mergeSorted.reverse(left, right); console.log(result); // [5, 4, 3, 2, 2, 1]
在上面的示例中,我们创建了两个已排序的数组,并使用 mergeSorted.reverse()
倒序合并它们。它会从数组的末端开始写入,一路向前直到达到其它给定的数组。
实现原理
在 merge-sorted
库中实现合并的核心算法是归并排序。归并排序递归地将待排序列表划分为两部分,对每个子列表进行排序,并最终将这些排序列表再次合并。
这个过程具体如下:
- 判断合并的两个数组的当前位置是否有一个为空
- 如果有一个为空数组,则将另一个数组的剩余元素拼接到结果数组的末尾
- 如果都不为空,则比较两个数组的当前元素
- 按照比较结果将最小的元素推入结果数组的末尾,并将该元素从其原来的数组中删除
- 重复上述过程,直到一个或两者数组为 0 为止
这个过程是通过递归函数实现的。每次递归都会将待排序的列表切分为长度为 2 的两个子列表,然后将两个子软列表分别传递给递归函数,并将其结果数组拼接。这个递归过程持续进行,直到列表被递归 base 下降为单个元素,即排序完成。
总结
merge-sorted
是一个非常有用的 npm 包,可以方便地合并已排序的数组,并能够利用自定义比较器函数(comparator function)进行特定差异的合并。此外,还支持同时合并多个已排序的数组和倒序合并数组。
了解这些操作,完全可以帮助我们更加高效、方便地进行前端开发工作,提高工作效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005671d81e8991b448e37d3