【问题标题】:Sort() function not working in TypeScript [closed]Sort() 函数在 TypeScript 中不起作用 [关闭]
【发布时间】:2022-12-19 14:29:55
【问题描述】:

我有以下表达式过滤数组中包含的单词,然后根据以搜索到的表达式开头的单词对它们进行排序,然后按最短到最长的顺序对它们进行排序。

切换到打字稿后,我有以下 2 个错误:

  • The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.ts(2362)
  • The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.ts(2363)

我尝试了使用valueOf()toString()as string 在网上找到的解决方案,但它们似乎不起作用。关于如何解决这个问题的任何帮助?

表达:

let wordsFiltered = wordList
  .filter(x => shoetest.simplify(x).toLowerCase().includes(shoetest.simplify(searchTerm).toLowerCase()))
  .sort((a, b) => b.startsWith(searchTerm) - a.startsWith(searchTerm))
  .sort((a, b) => a.length - b.length);

【问题讨论】:

  • 当您对非任何、数字或枚举类型的值进行算术运算时,会出现错误“算术运算的左侧必须是类型‘any’、‘number’、‘bigint’或枚举类型” ,例如一个约会。要解决错误,请将值转换为数字。
  • startsWith return true are you sure you want to type cast with subtracting .
  • @MohitSharma 谢谢。您对我如何最好地实现这一目标有何建议?
  • 你可以在它前面加上+ +a.startsWith()
  • 此外,您正在链接两个sort。那将只使用最终的排序逻辑,所以startsWith逻辑被完全忽略

标签: javascript typescript sorting typeerror


【解决方案1】:

您的sort 函数需要返回一个负数以将a 放在b 之前,返回一个正数以将b 放在a 之前,或者返回零以保持原样。 .startsWith 返回一个布尔值,所以你实际上在做类似 true - false 的事情,打字稿不喜欢。

因此,重写最后两种类型会更容易:

  .sort((a, b) => {
    if (a.startsWith(search) && !b.startsWith(search)) {
      return -1;
    } else if (!a.startsWith(search) && b.startsWith(search)) {
      return 1;
    } else {
      // Either both or neither start with search term, so sort by length.
      return a.length - b.length;
    }
  });

【讨论】:

    【解决方案2】:

    您可以通过附加 + 然后减去它们来将布尔值转换为数字。

    .sort((a, b) => +b.startsWith(searchTerm) - +a.startsWith(searchTerm) )
    

    还有一个问题。您正在链接 2 个 sort 调用。这将只使用第二个 sort 调用而忽略第一个。如果您尝试进行 thenBy 排序,如果两个项目 startsWith 相同 searchTerm 然后首先使用最短的一个,您需要使用 || 将其包含在同一个 sort

    // Declare it outside. No need to compute this in every call. 
    let shoetestValue = shoetest.simplify(searchTerm).toLowerCase();
    
    let wordsFiltered = wordList
      .filter(x => shoetest.simplify(x).toLowerCase().includes(shoetestValue))
      .sort((a, b) => 
            +b.startsWith(searchTerm) - +a.startsWith(searchTerm) 
              || a.length - b.length
          )
    

    这是一个 sn-p:

    const searchTerm = "b";
    const wordList = ["yellow", "black", "blue", "red"];
    
    const wordsFiltered = wordList
      .sort((a, b) =>
        +b.startsWith(searchTerm) - +a.startsWith(searchTerm) 
        || a.length - b.length
      )
    
    console.log(wordsFiltered)

    Typescript Payground with sample data

    【讨论】:

      猜你喜欢
      • 2020-08-02
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 2016-07-17
      • 2018-06-29
      相关资源
      最近更新 更多