Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   delete и функции (https://javascript.ru/forum/misc/11004-delete-i-funkcii.html)

KOLANICH 01.08.2010 23:05

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;
	}

JsLoveR 01.08.2010 23:08

el=null;

Gvozd 01.08.2010 23:08

судя по вашему коду, el - это элемент DOM
значит и удалять его надо соответствующим образом, через removeChild

если же вы хотите удалить элементы из массива, то и удаляйте из него.
el - всего лишь ссылается на элемент в DOM
он ничего не знает о том, в какой массив вы его засунули вовне

KOLANICH 01.08.2010 23:10

да, элемент дом
но мне не нужно удалять сам элемент
мне нужно удалить ссылку на него в массиве, полученном через getElemetsByTagName
короче мне нужно "профильтровать" массив

Sweet 01.08.2010 23:54

Почитайте здесь и узнаете, как "профильтровать" массив:)

x-yuri 02.08.2010 01:14

во-первых, из 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;
});

Kolyaj 02.08.2010 12:53

Цитата:

Сообщение от KOLANICH
мне нужно удалить ссылку на него в массиве, полученном через getElemetsByTagName

getElementsByTagName возвращает не массив.

Цитата:

Сообщение от x-yuri
Во-вторых, delete предназначен для удаления свойств объектов, а не элементов массива.

Но т.к. элемент массива это такое же свойство, он таки удалится :)

Цитата:

Сообщение от x-yuri
в результате код будет выглядеть как-то так:

И вместо одного прохода два.

x-yuri 02.08.2010 15:10

Цитата:

Сообщение от Kolyaj
Но т.к. элемент массива это такое же свойство, он таки удалится

var a = [1,2,3];
delete a[1];
alert(a);

удалится, но в результате получим разреженный массив, т.е. будут пропуски в элементах массива. Зачем делать проверки на существование элемента массива, если их можно не делать? Обычно так делают, потому что не знают, как сделать по-другому. Или когда нужен ассоциативный массив. Когда нужен разряженный массив... ничего в голову не приходит

Цитата:

Сообщение от Kolyaj
И вместо одного прохода два.

да, и что? Если выясниться, что это оказывает заметное влияние на производительность, всегда можно исправить

KOLANICH 02.08.2010 15:15

не пашед с методом filter
пишет, что его не существует

как преобразовать объект в массив?


пс как выяснилось , массивов вообще нет, одни объекты (создал массив через new Array, взял тип - объект)

Kolyaj 02.08.2010 15:16

Цитата:

Сообщение от x-yuri
Зачем делать проверки на существование элемента массива, если их можно не делать?

Ну когда как лучше. Если проверка на существование элемента дешевле перестановки кучи элементов, чтобы убрать дырку? Ты же в своём примере не удаляешь элементы из массива, а создаёшь новый.


Часовой пояс GMT +3, время: 04:50.