Проблема с удалением элементов из массива.

Discussion in 'PHP' started by 0o Chris o0, 4 Sep 2012.

  1. 0o Chris o0

    0o Chris o0 New Member

    Joined:
    16 Oct 2011
    Messages:
    142
    Likes Received:
    1
    Reputations:
    0
    Всем привет. На самом деле не знал, как назвать тему. Так что на название особо внимание не обращайте.

    Сначала немного опишу код ниже. window.Elements хранит некий список элементов, showCurElements() выводит список этих элементов в виде чекбокса, setLocalStorageData() записывает данные в local storage, restore() получает данные из local storage.
    Вот мы и пришли к deleteElements()... Она должна удалять элементы, выбранные в чекбоксе из showCurElements. Тут возникают проблемы, которые я уже очень долго не могу решить. Во-первых условие if(document.getElementById(name).checked) выполняется для некоторых элементов со 2 вызова deleteElements(), во-вторых не хочет удаляться элемент массива. Постарался все прокомментировать.
    Code:
    function deleteElements() {
        alert('1');//когда не выполняется условие, мы видим только этот алерт(это для тех элементов, для которых приходится вызывать deleteElements дважды)
    	var name;//хранит имена элементов из window.Elements
    	var i = 1;
    	var n;
    	for (i=1; i<window.Elements.length;i++) {
    	    name = window.Elements[i];//присваиваем имя
    		if(document.getElementById(name).checked) {//проверяем выбран ли этот элемент
    			for(n = i; n<window.Elements.length; n++) {
    			    if(n+1 != window.Elements.length) {//если  n+1 существует
                        window.Elements[n] = window.Elements[n+1];//смещаем все элементы массива, начиная с удаляемого+1 влево
    					window.Elements.splice(-1,1);//удаляем последний элемент массива
    				}	
                    if(n+1 != window.Styles.length) {
                        window.Styles[n] = window.Styles[n+1];
    					window.Styles.splice(-1,1);
    				}					
    			}
    			setLocalStorageData();//записываем новые данные в localStorage
    		}
    	}
    	showCurElements();// должна выводить элементы без удаленного
    }
    
    function showCurElements() {//функция вывода списка существующих элементов
        $("#box").empty();
    	html = '<form>'
    	for (i=1; i<window.Elements.length; i++) {
    			html += '<input type="checkbox" name="'+window.Elements[i]+'" id="'+window.Elements[i]+'" value="'+window.Elements[i]+'">'+window.Elements[i]+'</input><br>';
    	}
    	html += '</form>';
    	$("#box").append(html);
    }
    
    function setLocalStorageData() {
    	var data = JSON.stringify(window.Elements);
    	window.localStorage.Names = data;
    	data = JSON.stringify(window.Styles);
    	window.localStorage.Styles = data;
    	window.localStorage.NumOfElements = window.NumOfElements;
    }
    
    function restore() {//восстановление прошлой сессии
    	//window.localStorage.clear();
    	if(typeof(window.localStorage.Names) == "undefined" || typeof(window.localStorage.Styles) == "undefined") {//если нет таких переменных, то объявляем их
    		window.NumOfElements = 1;
    		window.Elements = new Array();
    		window.Styles = new Object();
    		alert('not found');
    		return false;
    	}
    	var i;
    	window.Elements = $.parseJSON(window.localStorage.Names);//получаем список имен элементов
    	window.Styles = $.parseJSON(window.localStorage.Styles);//получаем список стилей элементов
    	window.NumOfElements = window.localStorage.NumOfElements;//получаем кол-вo элементов
    	for(i=1;i<window.Elements.length;i++) {//это делал для вывода получаемых элементов
    	    alert(window.Elements[i]);
    	}
    	if(document.getElementById('elem1')) {
    		document.getElementById('elem1').name = 'div'+window.NumOfElements;//присваиваем имя последнего элемента
    	} 
    	showCurElements();//выводим полученные элементы
    }
    
    
    Уже голова взрывается, никак не могу разобраться :( Если кто захочет, могу кинуть полный код всего, пишите или в лс или skype: greenpois0nn.

    P.S. Сначала делал deleteElements() полностью через splice, но тогда скрипт вел себя совсем неадекватно, вместо удаляемых блоков появлялся undefined, а после обновления null
     
    #1 0o Chris o0, 4 Sep 2012
    Last edited: 4 Sep 2012
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    0o Chris o0 Не знаю как в JS, но во всех других языках программирования - плохая идея удалять элементы массива/списка/словаря во время перебора его значений.

    Что такое Array в JS? Если список, то например если вам нужно будет удалить два последовательных элемента - второй из этих двух элементов этот код не удалит. Потому что удаление первого - изменит нумерацию элементов но инкремент в любом случае произойдет.

    Правильным решением будет - Создавать пустой контейнер и добавлять туда элементы, которые нужно оставить по одному и ничего не удалять!

    splice судя из названия тоже ваш способ стрелять в ногу - потому что весь массив каждый раз пересоздается
     
    _________________________
  3. 0o Chris o0

    0o Chris o0 New Member

    Joined:
    16 Oct 2011
    Messages:
    142
    Likes Received:
    1
    Reputations:
    0
    Gifts, спасибо за совет. Буду переделывать