[英]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*$/
表示
^
从字符串的开头 (\\d+,)
匹配任意数量的数字( 0
.. 9
),后跟逗号,
。 记住这一点。 \\1
匹配此之后的所有内容,如果它与我们在2中看到的完全相同 接下来,
x.reduce(function(a, v, i, arr){ /*...*/}, '');
''
作为初始条件 x
,使用以下参数遍历调用该函数的每个项
a
累加器,先前返回的值(或对于第一次调用的初始状态) v
当前迭代中的项目 i
当前迭代的索引 .reduce
arr
(即x
, .reduce
的this
) 那么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
null
, RegExp不匹配)为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.