【问题标题】:how to convert javascript code functions to dart?如何将javascript代码函数转换为飞镖?
【发布时间】:2021-05-05 16:16:06
【问题描述】:

我有一个用 javascript 编写的代码,我正在尝试将其转录为 dart 这是我的 javascript 代码:

var Fn = {
    validateRut : function (rutComplete) {
        rutComplete = rutComplete.replace("‐","-");
        if (!/^[0-9]+[-|‐]{1}[0-9kK]{1}$/.test( rutComplete ))
            return false;
        var tmp     = rutComplete.split('-');
        var digv    = tmp[1]; 
        var rut     = tmp[0];
        if ( digv == 'K' ) digv = 'k' ;
        
       return (Fn.dv(rut) == digv );
    },
    dv : function(T){
        var M=0,S=1;
        for(;T;T=Math.floor(T/10)) 
            S=(S+T%10*(9-M++%6))%11;
        
        return S?S-1:'k';
    }
}

但我在 for 循环部分有问题,因为我不太了解 dart 的工作原理,这是我一直在研究的代码

class Rut{
  static bool validate(String rutComplete){
    rutComplete = rutComplete.replaceAll("‐","-");
    RegExp value=new RegExp(r'^[0-9]+[-|‐]{1}[0-9kK]{1}$');
   
    if (!value.hasMatch(rutComplete))
          return false;
    var tmp     = rutComplete.split('-');
        var digv    = tmp[1]; 
        var rut     = tmp[0];
        if ( digv == 'K' ) digv = 'k' ;
        return (dv(rut) == digv);
  }

  static String dv(String rut){
    var M=0,S=1;

   
    for(;int.parse(rut);rut=(int.parse(rut)/10).floor()) 
            S=(S+int.parse(rut)%10*(9-M++%6))%11;

  var result = S > 0 ? S-1:"k"; 
  return  result.toString();

}
}

非常感谢您的帮助

【问题讨论】:

标签: javascript dart


【解决方案1】:

您的代码几乎直接翻译自 JavaScript。

Javascript 有无类型变量和类型之间的自动强制转换,所以dv 方法的参数T 以字符串开头,然后由T = Math.floor(T / 10) 转换为数字,因为/ 自动将其操作数转换为数字。

Dart 没有强制,String 没有/ 运算符,所以这不起作用。 您需要引入一个新变量来保存该数字。比如:

static String dv(String rut){
  var m = 0, s = 1, t = int.parse(rut);
  for(;t > 0; t ~/= 10) {
    s = (s + t % 10 * (9 - m++ % 6)) % 11;
  }
  var result = s > 0 ? (s - 1).toString() : "k"; 
  return result;
}

或者,如果你想稍微优化一下,你可以直接从字符串中提取数字:

static String dv(String rut){
  var m = 0, s = 1;
  for (var i = rut.length - 1; i >= 0; i--) {
    var digit = rut.codeUnitAt(i) ^ 0x30;
    s = (s + digit * (9 - m++ % 6)) % 11;
  }
  var result = s > 0 ? (s-1).toString() : "k"; 
  return result;
}

另外,第一种方法也可以优化和简化:

static final _validateRE = RegExp(r'^(\d+)[\u2010-]([\dkK])$');
static bool validate(String rutComplete){
  var match = _validateRE.firstMatch(rutComplete);
  if (match == null) return false;
  var digv = match[2]!;  // remove `!` if not using null safety
  if (digv == 'K') digv = 'k';
  var rut = match[1]!;   // ditto
  return dv(rut) == digv;
}

这避免了在 RegExp 已经找到所有部分之后同时使用 RegExp 和 split。通过使 RegExp 捕获匹配项,您可以直接从匹配项中获取部分。此外,通过重用 RegExp,您可以避免为每次调用创建新的 RegExp 对象。

用普通破折号替换\u2010 破折号意味着您不必在正则表达式中同时匹配这两个破折号。由于再检查一个字符并不重要,我删除了replace。我还从[\u2010|-] 中删除了|,因为它实际上与| 匹配,并且当我阅读它时(一个快速的谷歌),在RUT 中只允许使用破折号。它是(\u2010|-)[\u2010-],在字符类中不需要|。 RegExp 中的{1} 表示“重复一次”,因此删除它们没有任何区别。

如果性能真的很重要,我可能会在不创建任何新子字符串的情况下进行检查,完全处理原始字符串,但对于正常使用,这应该没问题。

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 2021-04-04
    • 2021-04-12
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多