Как я могу предотвратить передачу этого последнего «нарушенного условия» в массив - PullRequest
0 голосов
/ 29 января 2019

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

slices(num){
    let arr = [this.digits.slice(0, num)]
    let i = 0
    if (this.digits.length < num){
            throw new Error('Slice size is too big.')
    } else {
        while (arr[i].length === num){
            i++
            arr.push(this.digits.slice(i, num + i))
        }
        // arr.pop() - removed for testing
        return arr
    }
}

Вот пример.Допустим, мы хотим нарезать этот массив:

this.digits = [ 3, 1, 0, 0, 1 ]

В идеале наш вывод будет выглядеть следующим образом:

[3, 1, 0], [1, 0, 0], [0, 0, 1]]

С моим текущим кодом и без использования arr.pop() мой алгоритм будетпоследовательно проскальзывать в дополнительной итерации среза, которая имеет меньшую длину, чем то, что запрашивает мое условное выражение (в данном случае num == 3)

Это будет мой вывод:

[[3, 1, 0], [1, 0, 0], [0, 0, 1], [0, 1]]

Я знаюЕсть много способов сделать это, но для этого я хотел бы сохранить целостность моего кода, поэтому было бы здорово использовать решение, использующее мою реализацию: D

РЕДАКТИРОВАТЬ: я понимаю, почему последний элементдобавляется.Поскольку элемент прежде выполняет условное условие (его длина равна num), он переходит к следующей итерации, но как я справляюсь с ним красноречиво, без использования .pop ()

РЕДАКТИРОВАТЬ: Спасибо всем за ответы!Кажется, что все они работают, но реализация Питера Б. была очень чистой, особенно учитывая, что он изменил для меня всего несколько строк, и это сработало как шарм.Еще раз спасибо!

Ответы [ 4 ]

0 голосов
/ 29 января 2019

Ты действительно близко.Я думаю, что мое предлагаемое решение здесь сохраняет общую идею вашего.Проблема, с которой вы сталкиваетесь, состоит в том, что проверка arr[i].length равной num означает, что это проверка только последнего элемента, добавленного в массив, а не следующего.Вместо этого отметьте элемент, который вы собираетесь добавить.

this.digits = [ 3, 1, 0, 0, 1 ];

function slices(num) {
    let arr = []
    let i = 0
    if (this.digits.length < num) {
            throw new Error('Slice size is too big.')
    } else {
        while (this.digits.slice(i, num + i).length === num){
            arr.push(this.digits.slice(i, num + i))
            i++
        }
        // arr.pop() - removed for testing
        return arr
    }
}

console.log(slices(3));
0 голосов
/ 29 января 2019

Вы проверяете неправильное состояние в while.Лучше рассчитать, сколько подмассивов вы собираетесь добавить в while (в дополнение к тому, с которого вы начинаете), и сосчитать до этого числа, например:

var digits = [3, 1, 0, 0, 1];

function slices(num) {
  let arr = [this.digits.slice(0, num)]
  let i = 0
  if (this.digits.length < num) {
    throw new Error('Slice size is too big.')
  } else {
    var sliceCutoff = this.digits.length - num;
    while (i < sliceCutoff) {
      i++
      arr.push(this.digits.slice(i, num + i))
    }
    return arr
  }
}

console.log(slices(3));
0 голосов
/ 29 января 2019

Описание

Я полагаю, что вы ищете что-то подобное?Как вы можете видеть, я также удалил некоторый избыточный код, то есть использовал цикл while в этом сценарии и предложение else.

Я также только что объявил digits в качестве параметра для этой демонстрации, я полагаю, что у вас будет инициатива, чтобы иметь возможность изменить это в соответствии с требованиями к вашим приложениям без особого /любая помощь.

function slices(digits, num) {
  const arr = [];

  if (digits.length < num)
    throw new Error('Slice size is too big.')

  for (let i = 0; i != num; i++)
    arr.push(digits.slice(i, num + i));

  return arr;
}

var d = [3, 1, 0, 0, 1]; // Only here for the demo.
console.log(slices(d, 3));
0 голосов
/ 29 января 2019

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

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

function slice(array, n) {
    var result = [], 
        start = 0;
    
    while (start + n <= array.length) {
        result.push(array.slice(start, start++ + n));
    }
    return result;
}

var array = [3, 1, 0, 0, 1];

console.log(slice(array, 3));
...