排序功能实现多列自定义差异

问题描述 投票:0回答:1

尝试实现如下自定义排序:

// 1. sort by 'value' column, here 'a' (first object) and b (second object) has difference equals to 4.5 or less then 4.5 then,
// consider equal values (even though it's 12.12 and 13.22) 
// then 2. sort by 'altValue' column (as equal value found on 'value' column) and then,
// 3. sort by 'name' column (as equal value found on 'altValue').
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 },
];

/* 下面的代码因无法在此处找到“b”值而出错 */

_.orderBy(
  inputArray,
  (a, b) => {
    console.log('a,b', a, b); // b is undfined

    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 is undfined

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

这里,无法获取“b”对象。 是否有使用 Array.sort 或其他 lodash 方法的替代方法可以帮助实现、按自定义差异进行排序并考虑按列进行多重排序。

谢谢你

javascript sorting ecmascript-6 lodash
1个回答
0
投票

Lodash

_.orderBy()
和 Underscore.js
_.sortBy()
不采用比较函数,它们采用
iteratee
参数,从元素中提取 。

使用内置的

sort()
方法,并用二次排序代替
return 0;
语句。

const validSortEqualityDiffence = 4.5;

inputArray.sort(
  (a, b) => {
    if (Math.abs(a.value - b.value) <= validSortEqualityDiffence) {
      if (Math.abs(a.altValue - b.altValue) <= validSortEqualityDiffence) {
        return 0;
      }
      if (a.altValue < b.altValue) {
        return -1;
      }
      return 1;
    }
    if (a.value < b.value) {
      return -1;
    }
    return 1;
  });

console.log(inputArray);
<script>
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 },
];
</script>

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.