繁体   English   中英

解释复杂的代码正则表达式

[英]Explain complicated code regular expression

最近,我遇到了一些应该与这些数组匹配的代码,尝试一下,因为我可能无法将所有难题都弄明白了

validateSequence([1,2,3,4,5,6,7,8,9]) === true
validateSequence([1,2,3,4,5,8,7,8,9]) === false
validateSequence([2,4,6,8,10]) === true
validateSequence([0,2,4,6,8]) === true
validateSequence([1,3,5,7,9]) === true
validateSequence([1,2,4,8,16,32,64]) === false
validateSequence([0,1,1,2,3,5,8,13,21,34]) === false

这是验证它的代码:

function validateSequence(x) {
  return !!x.reduce(function(a, v, i, arr){
    return (arr.length - 1 == i) ? a : a + (arr[i+1] - v) + ',';
  }, '').match(/^(\d+,)\1*$/);
}

例如两个是什么! 在x.reduce之前,它如何工作?

RegExp /^(\\d+,)\\1*$/表示

  1. ^从字符串的开头
  2. (\\d+,)匹配任意数量的数字( 0 .. 9 ),后跟逗号, 记住这一点。
  3. \\1匹配此之后的所有内容,如果它与我们在2中看到的完全相同
  4. 如果我们到达String的末尾,则模式为匹配项

接下来,

x.reduce(function(a, v, i, arr){ /*...*/}, ''); 
  1. 创建''作为初始条件
  2. Array x ,使用以下参数遍历调用该函数的每个项
    • a累加器,先前返回的值(或对于第一次调用的初始状态)
    • v当前迭代中的项目
    • i当前迭代的索引
    • 调用Array .reduce arr (即x.reducethis

那么return (arr.length - 1 == i) ? a : a + (arr[i+1] - v) + ',' return (arr.length - 1 == i) ? a : a + (arr[i+1] - v) + ','在做什么?

让我们将其重写为if..else并评论正在发生的事情

if (arr.length - 1 == i)   // if this is the last item in the array
    return a;              // return the accumulator (what we generated last invocation)
else                       // otherwise
    return a +             // return the accumulator AND
        (arr[i + 1] - v) + // the difference between this item and the next item AND
        ',';               // a comma

最后,我们需要了解的最后一点是!! 这只是转换的简写

  • 真实的东西 (例如任何对象[] ,非空字符串等)为true
  • 虚假的事情 (例如nullRegExp不匹配)为false

这将被应用到RegExp的结果中,因此它基本上意味着,如果我们找到匹配项,则返回true ,否则返回false


这说明,这是一种非常复杂的方法,可以执行以下操作

function validateSequence(seq) {
    var delta = seq[1] - seq[0],
        i;
    // some `.length` test here?
    for (i = 2; i < seq.length; ++i)
        if (seq[i - 1] + delta !== seq[i])
            return false;
    return true;
}

我不建议您使用提供的方法。

!! 被称为“ double-bang”或“ not-not”运算符,用于将对象强制转换为布尔值。 什么!! (不是)JavaScript中的运算符?

reduce是一个枚举数。 它将对数组中的每个元素执行一次回调。 参见https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

该函数正在数组中循环,并且仅当数组中的每个连续元素比上一个元素增加相同的整数值时,该函数才会返回true。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM