01.08.2010, 23:05
|
|
Профессор
|
|
Регистрация: 22.11.2008
Сообщений: 277
|
|
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;
}
Последний раз редактировалось KOLANICH, 01.08.2010 в 23:07.
|
|
01.08.2010, 23:08
|
Любитель
|
|
Регистрация: 16.12.2009
Сообщений: 422
|
|
|
|
01.08.2010, 23:08
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
судя по вашему коду, el - это элемент DOM
значит и удалять его надо соответствующим образом, через removeChild
если же вы хотите удалить элементы из массива, то и удаляйте из него.
el - всего лишь ссылается на элемент в DOM
он ничего не знает о том, в какой массив вы его засунули вовне
|
|
01.08.2010, 23:10
|
|
Профессор
|
|
Регистрация: 22.11.2008
Сообщений: 277
|
|
да, элемент дом
но мне не нужно удалять сам элемент
мне нужно удалить ссылку на него в массиве, полученном через getElemetsByTagName
короче мне нужно "профильтровать" массив
Последний раз редактировалось KOLANICH, 01.08.2010 в 23:16.
|
|
01.08.2010, 23:54
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Почитайте здесь и узнаете, как "профильтровать" массив
|
|
02.08.2010, 01:14
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
во-первых, из 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;
});
|
|
02.08.2010, 12:53
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от KOLANICH
|
мне нужно удалить ссылку на него в массиве, полученном через getElemetsByTagName
|
getElementsByTagName возвращает не массив.
Сообщение от x-yuri
|
Во-вторых, delete предназначен для удаления свойств объектов, а не элементов массива.
|
Но т.к. элемент массива это такое же свойство, он таки удалится
Сообщение от x-yuri
|
в результате код будет выглядеть как-то так:
|
И вместо одного прохода два.
|
|
02.08.2010, 15:10
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от Kolyaj
|
Но т.к. элемент массива это такое же свойство, он таки удалится
|
var a = [1,2,3];
delete a[1];
alert(a);
удалится, но в результате получим разреженный массив, т.е. будут пропуски в элементах массива. Зачем делать проверки на существование элемента массива, если их можно не делать? Обычно так делают, потому что не знают, как сделать по-другому. Или когда нужен ассоциативный массив. Когда нужен разряженный массив... ничего в голову не приходит
Сообщение от Kolyaj
|
И вместо одного прохода два.
|
да, и что? Если выясниться, что это оказывает заметное влияние на производительность, всегда можно исправить
|
|
02.08.2010, 15:15
|
|
Профессор
|
|
Регистрация: 22.11.2008
Сообщений: 277
|
|
не пашед с методом filter
пишет, что его не существует
как преобразовать объект в массив?
пс как выяснилось , массивов вообще нет, одни объекты (создал массив через new Array, взял тип - объект)
|
|
02.08.2010, 15:16
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от x-yuri
|
Зачем делать проверки на существование элемента массива, если их можно не делать?
|
Ну когда как лучше. Если проверка на существование элемента дешевле перестановки кучи элементов, чтобы убрать дырку? Ты же в своём примере не удаляешь элементы из массива, а создаёшь новый.
|
|
|
|