Боюсь, что с этим кодом есть несколько ошибок. Уже дан простой ответ: используйте 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}