Не удаляет элемент массива, который по модулю больше 10
выводит исходный массив, что и был введен не использую deletе, так как он оставит дыру в массиве... Может, я неверно понимаю смысла метода splice? помогите(
let gg=Math.abs(10);
var newArray1=new Array();
for(i=0;i<newArray.length;i++)
{
if (newArray[i]<gg)
{
newArray1.push(newArray[i]);
//newArray.splice(i, 1);
}
else if (newArray[i]>gg)
{
delete newArray[i];
}
}
document.getElementById('modul').value=newArray1;
Все! поняла, где ошибка) В условии надо было по модулю взять сами элементы массива, а не сравнивать с модулем десятки) Спасибо большое всем!!
Ответы (2 шт):
во-первых удалять элементы массива, идя по этому массиву, очень нехорошо - лезут побочные эффекты зачастую (поскольку этот процесс хождения по изменяемому массиву не совсем очевидный)
лучше собрать новый массив пройдя по старому массиву
например, оставить в массиве только нечётные числа:
arr = [1, 2, 3, 4, 5, 6, 7,]
arr = arr.filter(value => value % 2)
console.log(arr)
Модификация массива по месту без создания другого массива всё же порой необходима.
Смотри комментарии в коде ниже.
{ // Обозначим проблему
const a = [1, 15, 7, 12, 15, 9, 8, 11, 3];
for (let i = 0; i < a.length; ++i) {
if (Math.abs(a[i]) > 10) {
a.splice(i, 1);
}
}
console.log('Некоторые элементы пропущены', JSON.stringify(a));
}
{ // Решение проблемы в лоб
const a = [1, 15, 7, 12, 15, 9, 8, 11, 3];
for (let i = 0; i < a.length; ++i) {
if (Math.abs(a[i]) > 10) {
a.splice(i, 1);
// следующий элемент массива теперь лежит по текущему индексу
// Исправим переменную цикла
i--;
}
}
console.log('Ок. Модификация итератора', JSON.stringify(a));
}
{ // Обход проблемы
const a = [1, 15, 7, 12, 15, 9, 8, 11, 3];
// Проблема вообще не возникнет, если смотреть элементы от хвоста к голове
for (let i = a.length - 1; i >= 0; --i) {
if (Math.abs(a[i]) > 10) {
a.splice(i, 1);
}
}
console.log('Ок. Обратный проход', JSON.stringify(a));
}
{ // Ручное управление
const a = [1, 15, 7, 12, 15, 9, 8, 11, 3];
let insert = 0;
let check = 0;
while (check < a.length) {
if (!(Math.abs(a[check]) > 10)) {
// Помещаем значение на своё место
a[insert++] = a[check];
}
++check;
}
a.length = insert; // Устанавливаем новую длину массива
console.log('Ручной фильтр', JSON.stringify(a));
// Казалось бы, это прекрасно(ведь ничего лишнего!),
// но обычно встроенные функции вроде splice работают
// настолько быстрее ручных манипуляций, что сложно добиться лучших результатов.
// Хотя, на больших массивах можно заметить улучшение)
}