2015-12-13 4 views
3

Скажем, у меня есть массив, который содержит значения [1,2,3,6,7].Проверка Javascript, если элементы в массиве последовательны

Как проверить массив, чтобы увидеть, содержит ли он 3 последовательных номера. Например, массив выше имеет значение [1,2,3], поэтому это возвращает false в моей функции.

 var currentElement = null; 
     var counter = 0; 

     //check if the array contains 3 or more consecutive numbers: 
     for (var i = 0; i < bookedAppArray.length; i++) { 
      if ((bookedAppArray[i] != currentElement) && (bookedAppArray[i] === bookedAppArray[i - 1] + 1)) { 

       if (counter > 2) { 
        return true; 
       } 

       currentElement = bookedAppArray[i]; 
       counter++; 
      } else { 
       counter = 1; 
      } 
     } 

     if(counter > 2){ 
      return true; 
     } else{ 
      return false; 
     } 
+0

_ «Как я могу проверить массив, чтобы увидеть, если он имеет 3 последовательных чисел. Например, массив выше имеет место [1,2,3], так это будет возвращать ложь в моей функции.» _ Три последовательных числа _same_? – guest271314

+0

Вы хотите вернуть FALSE, если он * содержит * три цифры подряд? Это кажется неправильным. – Turophile

+0

возможно 3 и 6 должны возвращать false? –

ответ

-1

Попробуйте использовать Array.prototype.some(), Array.prototype.filter()

var arr1 = [1, 2, 3, 9, 8, 7]; 
 
var arr2 = [1, 2, "a", 3]; 
 
var check = function(a) { 
 
    // for each element in array `a` 
 
    return !a.some(function(item, index) { 
 
    // slice next three elements, including current element `item` from `a` array 
 
    var next = a.slice(index, 3); 
 
    console.log(next); 
 
    // if next three items in array `a` are type `Number` 
 
    // return `false`, else return `true` 
 
    return next.filter(Number).length === 3 ? true : false 
 
    }) 
 
}; 
 
// each item in `arr1` returns `false` , where item is followed 
 
// by two numbers 
 
// `arr2` returns `true` , where item is not followed by two numbers 
 
console.log(check([1,2,3]), check(arr1), check(arr2)) // `false`, `false`, `true`


В качестве альтернативы, используя for петлю, Array.prototype.every()

var arr1 = [1, 2, 3, 9, 8, 7]; 
 
var arr2 = [1, 2, "a", 3]; 
 
var check = function(a) { 
 
    var res; 
 
    for (var i = 0; i < a.length; i++) { 
 
    // if `a[i]` is followed by two numbers, return `false` 
 
    if (a.slice(i, 3).every(function(n) { 
 
     return typeof n === "number" 
 
    })) { 
 
     res = false; 
 
     break; 
 
    } 
 
    // if `a[i]` is not followed by two numbers, return `true` 
 
    else { 
 
     res = true; 
 
     break; 
 
    } 
 
    } 
 
    return res 
 
} 
 
console.log(check([1,2,3]), check(arr1), check(arr2)) // `false`, `false` , `true`

+0

Что он должен делать? Вы даже протестировали его? Если да, то можете ли вы объяснить, почему он всегда возвращает true, за исключением полностью пустого массива? – pawel

+0

@pawel Посмотреть обновленное сообщение – guest271314

0

Этот раствор

  • проверяет Wheater длину массива больше, чем 2,
  • перебирает массив из позиции 2
  • получает разницу между положением 2 и 1 перед индексом
  • проверяет, является ли абсолютная разница 1
  • проверяет разницу между позицией 1 до и при индексе равна разности,
  • , и если да, то возвращается false, потому что находятся последовательные элементы.
  • если нет, то приращение индекса по 1

function consecutive(array) { 
 
    var i = 2, d; 
 
    while (i < array.length) { 
 
     d = array[i - 1] - array[i - 2]; 
 
     if (Math.abs(d) === 1 && d === array[i] - array[i - 1]) { 
 
      return false; 
 
     } 
 
     i++; 
 
    } 
 
    return true; 
 
} 
 

 
document.write(consecutive([1]) + '<br>');    // true 
 
document.write(consecutive([2, 4, 6]) + '<br>');  // true 
 
document.write(consecutive([9, 8, 7]) + '<br>');  // false 
 
document.write(consecutive([1, 2, 3, 6, 7]) + '<br>'); // false 
 
document.write(consecutive([1, 2, 3, 4, 5]) + '<br>'); // false

0

Думая логически, то это должно быть так же просто, как Перебор массива, а просто проверка двух показателей предыдущих к текущему ,

Просто добавить 1 к предыдущему индексу и 2 к одному до этого один, и все они должны быть равны, что-то вроде этого

function hasThree(arr) { 
    var res = false; 

    arr.forEach(function(item, index) { 
     var l1 = arr[index - 1], // get previous 
      l2 = arr[index - 2]; // get the one before the previous 

     if (l1 && l2) { // if two previous exist 

      // add 1, and then 2, and see if all are equal 

      if (item === l1 + 1 && item === l2 + 2) res = true; 
     } 
    }); 

    return res; 
} 

FIDDLE

0

Интересная проблема. Вот моя попытка.

function cons(ar) { 

    var cnt = 0; 

    ar.forEach(function (i, idx) { 
     if (idx > 0) { 
      if (i == (ar[idx - 1] + 1)){ 
       cnt++; 
      } 
      else { 
       if (cnt < 2) 
        cnt = 0; 
      } 
     } 
    }); 

    return cnt < 2; 
} 

console.log('expected true', cons([1, 2, 5, 6, 9])); 
console.log('expected false', cons([0, 2, 3, 4, 6, 9])); 
console.log('expected false', cons([1, 2, 3, 4, 6, 9]));