如何编辑 curried/arrow 函数以包含正则表达式?

How to edit a curried/arrow function to include a regex?

我正在使用 Nick Grealy 惊人简洁的 table 排序器 (Sorting HTML table with JavaScript),但它无法正确排序美元金额列 {$199、$23、$46} 或美元金额列百分比 {10%, 3%, 5%};最大值未正确排序到顶部,因为算法正在执行文本排序,因为值包含非数字字符(% 和 $)。

我理解解决该问题的一般思路:删除任何 $ 或 % 符号,然后对结果(将是数字)进行排序。我的问题是 Grealy 的代码超出了我的理解范围,我不知道如何编辑它。我试过这个:

const comparer = (idx, asc) => (a, b) => ((v1, v2) => 
    v1=v1.replace(/[$%]/,''); // << My addition
    v2=v2.replace(/[$%]/,''); // << My addition
    v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2)
    )(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx));

但这给出了语法错误。我花了一些时间研究箭头函数和柯里化函数,但即使是简单的例子也很令人困惑,Grealy 的代码比这更复杂(例如, (v1,v2) 之前的额外 ( 直到几行之后才得到解决。如何修改代码以正确排序 $ 和 % 值?

如果你写多行函数,你需要使用大括号。

const comparer = (idx, asc) => (a, b) => ((v1, v2) => {
  v1 = v1.replace(/[$%]/,'');
  v2 = v2.replace(/[$%]/,'');
  return v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2)
})(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx));

*更新代码