多列自定义差值排序实现遇阻,求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
相关产品推荐
相关产品推荐

