You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:00:40