/ / Неможливо видалити навіть числа з мого масиву - javascript, масиви

Неможливо видалити навіть номери з мого масиву - javascript, масиви

Я намагаюся видалити всі парні числа з масиву, але він просто не видаляє їх. не знаю чому

 var arr = [3,45,56,7,88,56,34,345];
for (var i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0) {
arr.splice(i,1);
}
}

console.log(arr); дає це - [3, 45, 7, 56, 345] замість цього [3, 45, 7, 345]

Будь-які ідеї?

Відповіді:

7 для відповіді № 1

Так, це тому, що при з'єднанні елемента з масиву змінюється довжина масиву. Спробуйте це -

var arr = [3,45,56,7,88,56,34,345];

for (var i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0) {
arr.splice(i,1);
i = i-1; // SINCE YOU DELETED ONE ELEMENT,
// THE NEXT ELEMENT IN THE ARRAY GETS SHIFTED TO ONE POSITION ABOVE
//(SAY, FROM INDEX 4 TO 3). SO, YOU WILL NEED TO CHECK FROM INDEX 3 NOT 4
}
}

6 для відповіді № 2

Коли ви видаляєте 88, 56 після неї рухаються вгору на одну позицію, і ваш цикл пропускає його (він просто робить i++)

Необхідно бути обережним під час оновлення масиву під час його перегляду.

У цьому випадку можна повторити масив у зворотному порядку (почати з кінця, зробіть i--). Залежно від того, як реалізація зрощування, це може бути навіть трохи швидше (потенційно менше елементів масиву копіюються навколо).


6 за відповідь № 3

Довжина вашого масиву змінюється під час видалення елементів з нього.

Я б запропонував використовувати Array.prototype.filter для досягнення цієї мети (яка легко підібрана для IE <= 8):

var arr = [3,45,56,7,88,56,34,345];
arr = arr.filter( function is_odd(el) { return el % 2; } );

5 за відповідь № 4

Ви перебираєте ваш масив через i, який єзбільшується кожен раз. Після того, як він досягне 88, він зробить це, і все ще збільшує масив, який буде пропускатись через 56, наступний i буде означати 34.

Ви або не повинні збільшувати я, коли ви зрощуєте, або, коли ви зрощуєте, просто i--;


4 для відповіді № 5
arr.filter(function(item){return item % 2;}));