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

多列自定义差值排序实现遇阻,求Lodash/Array.sort替代方案

自定义多列差值排序实现方案

需求说明

  • 按value列排序,若两个对象的value差值≤4.5则视为值相等;
  • 若value视为相等,则按altValue列排序(同样差值≤4.5视为相等);
  • 若altValue也视为相等,则按name列排序。

测试数据

const validSortEqualityDiffence = 4.5;
const inputArray = [
  { id: 1, name: 'ABC INC.', value: 12.12, altValue: 22.22 },
  { id: 2, name: 'DBC INC.', value: 13.22, altValue: 23.32 },
  { id: 3, name: 'DBC INC.', value: 15.22, altValue: 25.42 },
  { id: 4, name: 'CBC INC.', value: 12.22, altValue: 22.32 },
  { id: 5, name: 'CBC INC.', value: 16.22, altValue: 26.32 },
  { id: 6, name: 'QBC INC.', value: 13.52, altValue: 23.72 },
  { id: 7, name: 'QBC INC.', value: 11.02, altValue: 21.92 },
];

问题场景

尝试用Lodash的_.orderBy实现时出错,因为_.orderBy的迭代函数仅接收单个当前元素,无法获取用于对比的第二个元素b:

/* 代码报错,b为undefined */
_.orderBy(
  inputArray,
  (a, b) => {
    console.log('a,b', a, b); // b无法获取

    if (Math.abs(a.value - b.value) <= validSortEqualityDiffence) {
      return 0;
    }
    if (a.value < b.value) {
      return -1;
    }
    return 1;
  },
  (a, b) => {
    console.log('a,b', a, b); // b无法获取

    if (Math.abs(a.altValue - b.altValue) <= validSortEqualityDiffence) {
      return 0;
    }
    if (a.altValue < b.altValue) {
      return -1;
    }
    return 1;
  },
  'name'
);

可行实现方案

方案1:原生Array.sort(推荐)

原生sort的回调函数直接接收两个对比元素,完美适配自定义差值判断逻辑:

// 复制原数组避免修改原始数据
const sortedArray = [...inputArray].sort((a, b) => {
  // 优先级1:对比value差值
  const valueDiff = Math.abs(a.value - b.value);
  if (valueDiff > validSortEqualityDiffence) {
    return a.value - b.value;
  }

  // 优先级2:value视为相等时,对比altValue差值
  const altValueDiff = Math.abs(a.altValue - b.altValue);
  if (altValueDiff > validSortEqualityDiffence) {
    return a.altValue - b.altValue;
  }

  // 优先级3:altValue视为相等时,按name字典序排序
  return a.name.localeCompare(b.name);
});

console.log(sortedArray);

方案2:Lodash _.sortBy(近似分组场景)

如果需用Lodash,可通过生成分组键的方式近似实现(将数值按4.5区间分组,差值在同一区间内视为相等):

// 生成value的分组键:按4.5区间划分
const getGroupKey = (num) => Math.floor(num / validSortEqualityDiffence);

const sortedArray = _.sortBy(inputArray, [
  item => getGroupKey(item.value),
  item => getGroupKey(item.altValue),
  'name'
]);

注意:此方式是区间分组,和“任意两元素差值≤4.5视为相等”的逻辑不完全一致,仅适合允许近似分组的业务场景。

内容的提问来源于stack exchange,提问作者dsi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:31:00