代码之家  ›  专栏  ›  技术社区  ›  dsi

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

  •  0
  • dsi  · 技术社区  · 9 月前

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

    // 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方法来帮助实现,使用自定义差异进行排序,并考虑按列排序。

    非常感谢。

    1 回复  |  直到 9 月前
        1
  •  2
  •   Barmar    9 月前

    Lodash _.orderBy() 和Undercore.js _.sortBy() 不要使用比较函数,它们使用 iteratee 参数,从每个元素中提取关键字。 b 是未定义的,因为一次只向函数传递一个元素。

    使用内置 sort() 方法,并将二次排序代替第一次排序 return 0; 语句,以及用三级排序代替二级排序 返回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 a.name.localeCompare(b.name);
          }
          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>