Sails.js中基于Waterline MongoDB实现数组排序与去重方案咨询
嘿,我来帮你搞定这个需求!JavaScript原生数组并没有自带distinct方法,但我们可以轻松实现你想要的「去重+指定方向排序」的功能,甚至能模拟你提到的array.distinct(sort:'ASC')这种调用方式。下面是几种实用的方案:
方案1:封装独立函数(推荐,不污染原生对象)
这种方式不会修改Array的原型,避免和其他代码冲突,是最安全的做法。我们可以把去重和排序逻辑封装成一个独立函数,支持传入排序方向参数:
const array = ["rahul","imran","Adi","samrat","Adi"]; // 封装函数:支持升序(ASC)/降序(DESC),默认升序 function distinctAndSort(arr, sortDirection = 'ASC') { // 第一步:去重,利用Set自动过滤重复值 const uniqueElements = [...new Set(arr)]; // 第二步:排序,处理大小写问题(避免大写字母排在前面) uniqueElements.sort((a, b) => { const lowerA = a.toLowerCase(); const lowerB = b.toLowerCase(); // 根据方向选择排序逻辑 return sortDirection === 'ASC' ? lowerA.localeCompare(lowerB) : lowerB.localeCompare(lowerA); }); return uniqueElements; } // 使用示例 const sortedArray = distinctAndSort(array, 'ASC'); console.log(sortedArray); // 输出: ["Adi", "imran", "rahul", "samrat"] // 试试降序 const descSortedArray = distinctAndSort(array, 'DESC'); console.log(descSortedArray); // 输出: ["samrat", "rahul", "imran", "Adi"]
额外优化:忽略大小写去重
如果你的数组里有大小写混合的重复值(比如"Adi"和"adi"),上面的代码会把它们当成不同元素。想要忽略大小写去重,可以修改去重逻辑:
function distinctAndSortIgnoreCase(arr, sortDirection = 'ASC') { const seen = new Map(); // 过滤重复值(忽略大小写) const uniqueElements = arr.filter(item => { const lowerItem = item.toLowerCase(); if (!seen.has(lowerItem)) { seen.set(lowerItem, item); return true; } return false; }); // 排序逻辑和之前一致 uniqueElements.sort((a, b) => { const lowerA = a.toLowerCase(); const lowerB = b.toLowerCase(); return sortDirection === 'ASC' ? lowerA.localeCompare(lowerB) : lowerB.localeCompare(lowerA); }); return uniqueElements; }
方案2:扩展Array原型(模拟你想要的调用方式)
如果你真的希望用array.distinct(sort:'ASC')这种语法,可以扩展Array的原型。不过要注意:不要在多人协作的生产项目中随意扩展原生对象原型,可能会和其他库冲突,但自己的小项目可以试试:
// 扩展Array原型,添加distinct方法 Array.prototype.distinct = function(options = { sort: 'ASC' }) { const { sort = 'ASC' } = options; // 去重逻辑(这里用Set,也可以换成上面的忽略大小写版本) const uniqueArr = [...new Set(this)]; // 排序逻辑 uniqueArr.sort((a, b) => { const lowerA = a.toLowerCase(); const lowerB = b.toLowerCase(); return sort === 'ASC' ? lowerA.localeCompare(lowerB) : lowerB.localeCompare(lowerA); }); return uniqueArr; }; // 现在可以直接调用啦! const array = ["rahul","imran","Adi","samrat","Adi"]; const sortedArray = array.distinct({ sort: 'ASC' }); console.log(sortedArray); // 输出: ["Adi", "imran", "rahul", "samrat"] // 默认升序可以不传参数 const defaultSorted = array.distinct(); console.log(defaultSorted); // 同样输出升序结果
方案3:先排序再去重(适合大数组)
如果你的数组元素很多,先排序再去重会更高效——因为排序后重复值会相邻,只需要遍历一次就能完成去重:
function distinctAndSortLargeArray(arr, sortDirection = 'ASC') { // 先排序(复制原数组避免修改原数据) const sortedArr = [...arr].sort((a, b) => { const lowerA = a.toLowerCase(); const lowerB = b.toLowerCase(); return sortDirection === 'ASC' ? lowerA.localeCompare(lowerB) : lowerB.localeCompare(lowerA); }); // 去重:遍历排序后的数组,只保留和前一个元素不同的项 const uniqueArr = sortedArr.filter((item, index) => { return index === 0 || item.toLowerCase() !== sortedArr[index - 1].toLowerCase(); }); return uniqueArr; }
这个方案的内存占用更低,尤其适合处理包含上千个元素的数组。
内容的提问来源于stack exchange,提问作者Anuj Kumar Pal
相关产品推荐
相关产品推荐

