2015-11-18 2 views
0

Недавно я наткнулся на некоторый код, который должен соответствовать этим массивам попробовать, как я мог бы я не мог получить все кусочки головоломки вместе, чтобы иметь смыслОбъясните сложный код регулярного выражение

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 и как это работает?

+0

Ваш вопрос о [двойном взрыве] (http://stackoverflow.com/q/784929/2679750) или RegExp? –

+0

более общий, как работает весь этот код –

ответ

2

RegExp/^(\d+,)\1*$/ означает

  1. ^ С началом строки
  2. (\d+,) матчем любого числа цифр (0 .. 9) с последующей запятой ,. Помни это.
  3. \1 матч все, что следует за этим, если это точно так же, как то, что мы видели в 2
  4. Если мы достигли конца строки, шаблон матч

Далее в следующем,

x.reduce(function(a, v, i, arr){ /*...*/}, ''); 
  1. Создать '' как п начального условия
  2. На массивеx, итерации по каждому пункту вызова функции со следующими параметрами
    • a аккумулятором, предыдущее возвращаемое значение (или начальным условием для первого вызова)
    • v в пункт на текущей итерации
    • i индекс в текущей итерации
    • arrмассива.reduce (т. x, то this из .reduce)

Так что же 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 

Наконец, последний бит мы должны понять !!.Это просто сокращение для преобразования

  • truthy вещь (например, любой объект [], не пустая строка и т.д.), чтобы true
  • falsy вещь (например null, RegExp не совпадают) чтобы false

Это применяется к результату RegExp так это в основном означает, если мы нашли совпадение return 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; 
} 

Я бы не рекомендовал использовать метод вы предоставили.

+0

S.so позвольте мне получить этот пролив, что именно представляет собой аккумулятор, как-то разница между предыдущим и следующим элементом и возвращается, как он остается таким же даже после оператора termany (если иначе) он получает plused (arr [i + 1] - v) + ','; –

+1

@AaronRabinowitz Аккумулятор - это предыдущее возвращаемое значение. Например. если последняя итерация 'return'ed' "4,' ',' a' в текущей итерации равна «4», «. Если вы затем вернете «a +» 6, «', то 'a' в следующей итерации будет поэтому« 4,6 »,«. Если бы у нас не хватило элементов для итерации, '" 4,6, "' было бы окончательным возвращенным значением '.reduce' –

1

!! известен как оператор «двойного взрыва» или «не-не» и используется для принуждения объекта к булевому. См. What is the !! (not not) operator in JavaScript?

reduce является перечислителем. Он будет выполнять обратный вызов один раз для каждого элемента массива. См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

Функция выполняет цикл по массиву и возвращает true только в том случае, если каждый последующий элемент в массиве увеличивается на одно и то же целочисленное значение по сравнению с предыдущим.

+1

Подсказка: Удалите !! от возвращаемого значения и наблюдать за выходом. – mysmallidea

+0

Проверьте https://jsfiddle.net/Lhb3vwLr/ – mysmallidea

+1

Обновлено: https://jsfiddle.net/Lhb3vwLr/2/ – mysmallidea

Смежные вопросы