Получение неправильного значения при фильтрации отсутствующего значения из массива - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу отфильтровать пропущенное число из последовательного массива, используя javascript, но получаю неправильное значение. Я объясняю мой код ниже.

let arr1 = [1,2,3,4,5,6,7,8,10];

arr1 = arr1.filter((item,pos) => {
  if(pos < arr1.length && arr1[pos+1] !== undefined) {
    if(item !== arr1[pos+1]-1){
      //console.log(item,arr1[pos+1]-1);
      return arr1[pos+1]-1;
    }
  }

})

console.log(arr1); 

Здесь 9 отсутствует в моем массиве, но я получаю вывод [8] в качестве вывода.

Ответы [ 5 ]

1 голос
/ 27 апреля 2020

Вам нужен другой подход, потому что ваша фильтрация возвращает только значение, которое в массиве, но не отсутствует. Также как вы не получаете дырки с более чем одним значением.

Это решение выполняет итерацию массива и принимает переменную для ожидаемого значения, и если это значение меньше значения массива, оно выполняет итерацию до тех пор, пока данное значение не будет получено из массив.

let array = [1, 2, 3, 6, 7, 8, 10],
    missing = [],
    value = array[0],
    i;

for (i = 0; i < array.length; i++) {
    while (value < array[i]) missing.push(value++);
    ++value;
}

console.log(missing);
0 голосов
/ 27 апреля 2020

Как уже говорилось, вы не можете использовать filter, поскольку его цель - фильтровать значения данного массива.

Вы можете попробовать использовать reduce, чтобы найти несколько пробелов:

let arr1 = [1, 2, 4, 5, 6, 7, 8, 12];

arr1 = arr1.reduce((carry, item, index) => {
    item++;
    
    while (index !== arr1.length - 1 && item < arr1[index + 1]) {
        carry.push(item++);
    }
    
    return carry;
}, []);

console.log(arr1);
0 голосов
/ 27 апреля 2020

filter метод возвращает только существующих элементов, которые оцениваются как true в функции обратного вызова :

filter () вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве и создает новый массив из всех значений, для которых обратный вызов возвращает значение, которое приводит к истинному .

Таким образом, метод filter не может возвращать увеличенный значения из существующего массива.

Вы можете использовать метод reduce для поиска пропусков:

let arr1 = [1,2,3,4,5,6,7,8,10];

arr1 = arr1.reduce((a, c, i) => {
  if ((c + 1) < arr1[i + 1])
    a.push(c + 1);
  return a;
}, [])

console.log(arr1);
0 голосов
/ 27 апреля 2020

Вы уже знаете, что метод filter возвращает существующие значения.

Чтобы найти непоследовательные числа в массиве чисел, вы можете использовать различные методы (например, reduce или al oop), см. Другие ответы. Они работают для отсортированных массивов.

Функция в этом фрагменте берет минимальное и максимальное значение из заданного массива и, для всех значений от этого минимума до максимума, проверяет данный массив на наличие значения. Он найдет всех пробелов в массиве чисел. Данный массив не нужно (предварительно) сортировать. Он может получить необязательный начальный номер (минимальное значение) для данного массива. И, наконец, выдает ошибку, когда данный массив содержит ненулевые c значения.

console.log(findNonConsecutiveNumbersInArray([1, 2, 3, 4, 5, 6, 7, 8, 10]).join());
console.log(findNonConsecutiveNumbersInArray([1, 6, 7, 8, 10, 11, 12, 15]).join());
console.log(findNonConsecutiveNumbersInArray([6, 8, 2, 1, 9]).join());
console.log(findNonConsecutiveNumbersInArray([6, 14, 9, 8]).join());
console.log(findNonConsecutiveNumbersInArray([6, 14, 9, 8], 1).join());
console.log(findNonConsecutiveNumbersInArray([6, 14, 9, 8, 'Not A Number']).join());

function findNonConsecutiveNumbersInArray(arrayOfNumbers, start) {
  if (arrayOfNumbers.find( v => v.constructor !== Number) ) {
    throw new RangeError("The provided Array should only contain numbers");
  }
  
  let index = start ? start - 1 : Math.min.apply(null, arrayOfNumbers);
  const max = Math.max.apply(null, arrayOfNumbers);
  let result = [];
  
  while (index++ < max) {
    if (!arrayOfNumbers.includes(index)){
      result.push(index);
    }
  }
  return result;
}
.as-console-wrapper { top: 0; max-height: 100% !important; }
0 голосов
/ 27 апреля 2020

Вы можете сделать это, как показано ниже. Здесь перебираем все элементы и проверяем, равна ли разница между текущим элементом и предыдущим текущего элемента 1 или нет, если нет, то возвращаем (текущий элемент -1).

let arr1 = [1,2,3,4,5,6,7,8,10];

for(var i = 1; i < arr1.length; i++) {
   if(arr1[i] - arr1[i-1] != 1) {
    console.log(arr1[i]-1);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...