Есть ли способ удалить определенные c элементов кода в зависимости от их длины? - PullRequest
0 голосов
/ 14 июля 2020

У меня здесь есть этот код, который должен принимать длину этих разных элементов, и если длина больше 4, он должен удалить эти значения. Однако он говорит, что if (array [i] .length> 4) не определено

let words = ["Apple", "Ben", "Ice", "Dog", "Tornado"];

function removeWords(array) {
  for (var i = 0; i < array.length; i++) {
    console.log(array[i].length);
  }
  if (array.length > 4) {
    array[i].splice();
  }
}

console.log(removeWords(words));

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Вы можете использовать Array.filter()

let words = ["Apple", "Ben", "Ice", "Dog", "Tornado"].filter(w => w.length <= 4);


console.log(words);
2 голосов
/ 14 июля 2020

Боюсь, что с этим кодом есть несколько ошибок. Уже дан простой ответ: используйте filter. Если это все, что вы хотите знать, отлично. Если вы хотите проработать это, чтобы получить рабочую версию, вот несколько шагов:

Мы начинаем с

let words = ["Apple", "Ben", "Ice", "Dog", "Tornado"];

function removeWords(array) {
  for (var i = 0; i < array.length; i++) {
    console.log(array[i].length);
  }
  if (array.length > 4) {
    array[i].splice();
  }
}

console.log(removeWords(words));

Первое, что нужно заметить, это то, что мы вызываем console.log на результат звонка removeWords. Но removeWords ничего не возвращает. Итак, давайте сначала исправим это:

function removeWords(array) {
  for (var i = 0; i < array.length; i++) {
    console.log(array[i].length);
  }
  if (array.length > 4) {
    array[i].splice();
  }
  return array;  // <--------------------- added  
}

А теперь давайте посмотрим на тест, который вы проводите. if (array.length > 4). Вы хотите проверить внутри вашего l oop, так как вы хотите проверить каждое слово в списке. У вас уже есть l oop, но он содержит только отладочный код оператора console.log. Давайте переместим это и переместим тест и связанные с ним изменения внутрь него:

function removeWords(array) {
  for (var i = 0; i < array.length; i++) {
    if (array.length > 4) {  //  ---\
      array[i].splice();     //  --- >---- moved inside loop
    }                        //  ---/
  }
  return array;
}

Но теперь давайте посмотрим на этот тест. Мы должны проверить, что слово имеет длину больше 4, а не массив . Итак, нам нужно проверить, есть ли у array[i] > 4:

function removeWords(array) {
  for (var i = 0; i < array.length; i++) {
    if (array[i].length > 4) {  // <------ changed
      array[i].splice();
    }
  }
  return array;
}

противоположная проблема при вызове splice. Вы пытаетесь вызвать splice по слову, когда хотите сделать это с массивом. Вы хотите удалить один элемент по индексу i в массиве. Мы можем исправить это с помощью

function removeWords(array) {
  for (var i = 0; i < array.length; i++) {
    if (array[i].length > 4) {
      array.splice(i, 1);  // <----------- changed
    }
  }
  return array;
}

Следующая проблема более тонкая. И это даже не повлияет на ваш тестовый пример. Но если мы запустим эту функцию для этого списка: ["Apple", "Ben", "Ice", "Dog", "Tornado", "Windshield", "Axe"], мы вернемся ["Ben", "Ice", "Dog", "Windshield", "Axe"]. Мы включили сюда "Windshield" из-за взаимодействия между вашим l oop и вызовом splice. Мы весело продолжаем, пока i не станет 3. На данный момент наш массив включает ["Ben", "Ice", "Dog", "Tornado", "Windshield", "Axe"], потому что мы уже удалили «Apple». Проверяем индекс 3, видим, что «Торнадо» имеет более четырех букв, и снова splice, оставляя ["Ben", "Ice", "Dog", "Windshield", "Axe"]. Но теперь индекс равен 4, а наше тестовое слово - "Axe" Мы пропустили «Лобовое стекло»!

Это происходит потому, что, пока вы хотите проверить каждое слово в массиве, ваш splice вызов изменяет длину массива, как вы go. Один из способов исправить это - ввести l oop в обратном порядке. Начиная с конца, splice повлияет на индексы только тех вещей, которые вы уже протестировали. Это может выглядеть так:

function removeWords(array) {
            //      +--------------+-----+- changed
            //      |              |     |
            //      v              v     v
  for (var i = array.length - 1; i >= 0; i--) {
    if (array[i].length > 4) {
      array.splice(i, 1); 
    }
  }
  return array;
}

Это первая рабочая версия кода. Мы можем оставить это там. Но есть еще потенциальная проблема. Вы меняете ввод как go. Существует сильная школа мысли, которая считает это довольно ужасным поступком. Поэтому вместо изменения наших исходных входных данных давайте сначала сделаем их копию, а затем изменим и вернем это. Есть много способов сделать неглубокий клон ввода, в том числе с помощью slice или concat. Современный вариант, вероятно, использует такую ​​нотацию распространения:

function removeWords(words) {
            //         ^--------+---------- changed
  let array = [...words] // <---'
  for (var i = array.length - 1; i >= 0; i--) {
    if (array[i].length > 4) {
      array.splice(i, 1); 
    }
  }
  return array;
}

Теперь это разумная версия функции ... если бы у нас еще не было Array.prototype.filter доступный. Вы можете увидеть это в действии в следующем фрагменте:

function removeWords(words) {
  let array = [...words]
  for (var i = array.length - 1; i >= 0; i--) {
    if (array[i].length > 4) {
      array.splice(i, 1); 
    }
  }
  return array;
}

let words = ["Apple", "Ben", "Ice", "Dog", "Tornado"];
let words2 = ["Apple", "Ben", "Ice", "Dog", "Tornado", "Windshield", "Axe"];

console.log (removeWords(words));
console.log (removeWords(words2));

console.log ("--------------\nOriginals Untouched\n--------------")

console.log (words);
console.log (words2);
.as-console-wrapper {min-height: 100% !important; top: 0}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...