Возвращать только числа и удалять строки из существующего массива в JavaScript? - PullRequest
0 голосов
/ 29 октября 2018

Я искал среди множества похожих вопросов, но не смог найти ответ на этот хитрый вопрос.Мне нужна функция, которая удаляет все элементы, которые не являются числами из массива.Но функция должна модифицировать существующий массив, а не создавать новый.Я пытался сделать что-то вроде этого:

 let array = [1, 'a', 'b', 2];
 array = array.filter(item => typeof item !== "string");
 console.log(array);

 //--> [1, 2]

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

Так что у кого-то больше опыта, чем у меня, в решении этих проблем, с точки зрения своих мыслей я пытаюсь что-то делать часами с помощью array.splice иза петли, но ничего не удачно. Заранее спасибо, и извините за длинный вступительный пост.

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Вы можете сделать это с помощью указателя и цикла while, который проверяет, достиг ли указатель конца массива:

let array = [1, 'a', 'b', 2, 3, 'c', 'd', 3];
let i = 0;

while (i < array.length) {
  if (typeof array[i] === "string") array.splice(i, 1);
  else i++;
}

console.log(array);

Обратите внимание, что если мы решим splice что-то, мы не увеличим указатель.

0 голосов
/ 29 октября 2018

Вы всегда можете попробовать сначала отсортировать, а не зацикливать.Например:

const array = [1, 'a', 'b', '2', 3, 2]

// sort into strings after everything else
array.sort(a => typeof a === 'string')
// splice the string parts away
array.splice(array.findIndex(i => typeof i === 'string'))

console.log(array)

//--> [1, 3, 2]

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

Но на самом деле, почему вы вынуждены изменять исходный массив?Кажется ненужным, и использование filter сделает ваш код намного более читабельным.

0 голосов
/ 29 октября 2018

Вы можете использовать Array#splice() в обратном for цикле

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

let array = [1, 'a', 'b', 2];

for (let i = array.length - 1; i >= 0; i--) {
  if (typeof array[i] === "string") {// modify conditional as needed
    array.splice(i, 1);
  }
}

console.log(array);

//--> [1, 2]
...