Я намагаюся видалити всі парні числа з масиву, але він просто не видаляє їх. не знаю чому
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;}));