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, время: 19:22. |