delete и функции
есть массив
я создал функкцию, которая проверяет элемент массива на условие и в зависимо от результата проверки удаляет или нет эл-т массива после прохода функцией по массиву (в цикле) все эл-ты на месте, хотя сработало условие для удаления (причём довольно много раз) function fakeCheck(el){ if(el.style.display=='none'||el.type=="hidden"||el.style.zIndex<=-3){ console.log("deleting ", el) delete el; return false; } return true; } |
el=null; |
судя по вашему коду, el - это элемент DOM
значит и удалять его надо соответствующим образом, через removeChild если же вы хотите удалить элементы из массива, то и удаляйте из него. el - всего лишь ссылается на элемент в DOM он ничего не знает о том, в какой массив вы его засунули вовне |
да, элемент дом
но мне не нужно удалять сам элемент мне нужно удалить ссылку на него в массиве, полученном через getElemetsByTagName короче мне нужно "профильтровать" массив |
Почитайте здесь и узнаете, как "профильтровать" массив:)
|
во-первых, из HTMLCollection нельзя ничего удалять. Во-вторых, delete предназначен для удаления свойств объектов, а не элементов массива. В-третьих, массивы фильтруются с помощью метода filter. Здесь сказано, как использовать его кроссбраузерно. Для копирования массивов можно использовать следующую функцию (в частности работает при копировании из HTMLCollection и arguments)
function $A(iterable){ if (iterable.item){ var l = iterable.length, array = new Array(l); while (l--) array[l] = iterable[l]; return array; } return Array.prototype.slice.call(iterable); }; в результате код будет выглядеть как-то так: var divs = document.getElementsByTagName('div'); divs = $A(divs).filter(function(el){ return el.style.display != 'none' && el.type=="hidden" && el.style.zIndex<=-3; }); |
Цитата:
Цитата:
Цитата:
|
Цитата:
var a = [1,2,3]; delete a[1]; alert(a); удалится, но в результате получим разреженный массив, т.е. будут пропуски в элементах массива. Зачем делать проверки на существование элемента массива, если их можно не делать? Обычно так делают, потому что не знают, как сделать по-другому. Или когда нужен ассоциативный массив. Когда нужен разряженный массив... ничего в голову не приходит Цитата:
|
не пашед с методом filter
пишет, что его не существует как преобразовать объект в массив? пс как выяснилось , массивов вообще нет, одни объекты (создал массив через new Array, взял тип - объект) |
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
alert([] instanceof Array); alert({} instanceof Array); |
Цитата:
тогда проще фильтрацию сразу в копирование вставить |
Цитата:
Цитата:
|
Цитата:
var divs = document.getElementsByTagName('div'); divs = [].filter.call(divs, function(el){ return el.style.display != 'none' && el.type=="hidden" && el.style.zIndex<=-3; }); Тогда будет один проход. |
может так ?
for (var divs = document.getElementsByTagName("div"), c = [], i = 0; i < divs.length; i++) divs[i].style.display != "none" && divs[i].type != "hidden" && divs[i].style.zIndex > -3 && c.push(divs[i]); divs = c; |
рони,
это то же самое, только вместо filter руками цикл записывается. |
function fakeCheck(els){ var checked=[]; for(var i=0;i<els.length;i++){ if(els[i].style.display!='none'&&els[i].type!="hidden"&&els[i].style.zIndex>=0){ checked.push(els[i]); } } return checked; } у меня так |
рони, тогда давай уж так, зачем на полпути останавливаться? (алгоритм, кстати, тоже немного поменял)
for(var a=document.getElementsByTagName("div"),b=[],i=a.length-1;i>=0;i--)a[i].style.display!="none"&&a[i].type!="hidden"&&a[i].style.zIndex>-3&&(b[i]=a[i]); |
x-yuri,
гмм массив с дырками от которых вроде уходили ? или я чего не понял? |
а, провтыкал, забыл, что там фильтруются элементы. Будем считать, что я хотел что-то такое написать
for(var a=document.getElementsByTagName("div"),b=[],i=0,c=a.length;i<c;i++)a[i].style.display!="none"&&a[i].type!="hidden"&&a[i].style.zIndex>-3&&b.push(a[i]); хотя... массив с дырками... звучит заманчиво... нам ли, оптимизатором, не привыкать спотыкаться об эти дырки? Зато цикл быстрее работать стал, м? ;) |
Часовой пояс GMT +3, время: 09:07. |