Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не могу понять, помогите, indexOf (https://javascript.ru/forum/misc/71217-ne-mogu-ponyat-pomogite-indexof.html)

SergoMorello 02.11.2017 16:22

Не могу понять, помогите, indexOf
 
Ребят всем привет, долблюсь в эту функцию уже 2 часа, не могу понять почему не работает поиск значения в массиве,

задача функции проста, при нажатии на нужный обьект добавлять в определённое место страницы нужную картинку, к тому же с записью id этой картинки в массив чтобы при повторном нажатии удалить картинку и запись в массиве,

вроде бы всё работает отлично сделал условия для каждой картинки, проверку на наличие id в массиве, всё работает, но есть одно но - для определённых нажимаемых обьектов нужны пары, и вот с этим то и возникли проблемы,

добавил условий в финкцию для того чтобы запустить функцию ещё раз для нужных парных картинок,
всё вроде работает выбираю например обьект 1 добавляется соответственно картинка 1 и картинка из обьекта 13, если повторно нажать на обьект 1 то обе картинки удаляются и стераются их записи из массива,
но если опять же выбрать обьект 1 - снова появятся картинки и после этого нажать на обьект 13 то удаления не происходит, по причине того что indexof не находит id в массиве, хотя и 1 и 13 id там есть,

вроде всё обьяснил, сорри если как то запутанно, заранее спс за помощь, код функции прикладываю

var s_obj=new Array();
			
				$("div#set_obj").on("click", function(e){
					
				  if ( e.target.id === "set_obj" ) {
				  
				  set_car_obj($(this).attr("obj_id"),1);
				  }
				});
			
			
			function set_car_obj(obj,type) {
			
			alert(s_obj+"< "+type+" >"+s_obj.indexOf(obj));

                   
					if (s_obj.indexOf(obj)!=-1) {$("#objimg_"+obj).remove();s_obj.splice(s_obj.indexOf(obj),1);}else{s_obj[s_obj.length]=obj;
						if (obj==1) {$("#objblock").append("<img src='/img/zak_book/p_bamper_l.png' style='z-index:79;position:absolute;margin-left:5px;margin-top:46px;' id='objimg_1'>");}
						if (obj==2) {$("#objblock").append("<img src='/img/zak_book/p_krilo_l.png' style='z-index:79;position:absolute;margin-left:21px;margin-top:38px;' id='objimg_2'>");}
						if (obj==3) {$("#objblock").append("<img src='/img/zak_book/p_dver_l.png' style='z-index:79;position:absolute;margin-left:86px;margin-top:31px;' id='objimg_3'>");}
						if (obj==4) {$("#objblock").append("<img src='/img/zak_book/z_dver_l.png' style='z-index:79;position:absolute;margin-left:148px;margin-top:29px;' id='objimg_4'>");}
						if (obj==5) {$("#objblock").append("<img src='/img/zak_book/z_krilo_l.png' style='z-index:79;position:absolute;margin-left:89px;margin-top:6px;' id='objimg_5'>");}
						if (obj==6) {$("#objblock").append("<img src='/img/zak_book/z_bamper_l.png' style='z-index:79;position:absolute;margin-left:223px;margin-top:42px;' id='objimg_6'>");}
						if (obj==7) {$("#objblock").append("<img src='/img/zak_book/porog_l.png' style='z-index:79;position:absolute;margin-left:70px;margin-top:66px;' id='objimg_7'>");}
						
						if (obj==8) {$("#objblock").append("<img src='/img/zak_book/z_bamper_p.png' style='z-index:79;position:absolute;margin-left:7px;margin-top:171px;' id='objimg_8'>");}
						if (obj==9) {$("#objblock").append("<img src='/img/zak_book/z_krilo_p.png' style='z-index:79;position:absolute;margin-left:23px;margin-top:133px;' id='objimg_9'>");}
						if (obj==10) {$("#objblock").append("<img src='/img/zak_book/z_dver_p.png' style='z-index:79;position:absolute;margin-left:55px;margin-top:157px;' id='objimg_10'>");}
						if (obj==11) {$("#objblock").append("<img src='/img/zak_book/p_dver_p.png' style='z-index:79;position:absolute;margin-left:114px;margin-top:159px;' id='objimg_11'>");}
						if (obj==12) {$("#objblock").append("<img src='/img/zak_book/p_krilo_p.png' style='z-index:79;position:absolute;margin-left:179px;margin-top:166px;' id='objimg_12'>");}
						if (obj==13) {$("#objblock").append("<img src='/img/zak_book/p_bamper_p.png' style='z-index:79;position:absolute;margin-left:228px;margin-top:175px;' id='objimg_13'>");}
						if (obj==14) {$("#objblock").append("<img src='/img/zak_book/porog_p.png' style='z-index:79;position:absolute;margin-left:78px;margin-top:194px;' id='objimg_14'>");}
						
						
					}
                     if (type==1) {
						 if (obj==1) {set_car_obj(13,0);}
						 if (obj==13) {set_car_obj(1,0);}
						 
						 if (obj==6) {set_car_obj(8,0);}
						 if (obj==8) {set_car_obj(6,0);}
						 
					 }
			}

Rasy 02.11.2017 16:38

SergoMorello,
4 и 8 строки лишние.
17 условие не выполниться ни разу, т.к. массив пустой и в него ничего не добавляется.

SergoMorello 02.11.2017 16:52

Цитата:

Сообщение от Rasy (Сообщение 468944)
SergoMorello,
4 и 8 строки лишние.
17 условие не выполниться ни разу, т.к. массив пустой и в него ничего не добавляется.

там же после условия с поиском в массиве написано }else{s_obj[s_obj.length]=obj;
как раз на той же 17 строке,

проблема только только одна в поиске id в массиве, больше нет проблем

Rasy 02.11.2017 17:33

SergoMorello,
Цитата:

Сообщение от SergoMorello
но если опять же выбрать обьект 1 - снова появятся картинки и после этого нажать на обьект 13 то удаления не происходит, по причине того что indexof не находит id в массиве, хотя и 1 и 13 id там есть,

При клике на объект 13 в массиве есть элементы: 1 под индексом 0 и 13 под индексом 1.
Должен удаляться 13 элемент (индекс 1) из массива и картинка objimg_13, но первый остается нетронутым.

Rasy 02.11.2017 17:40

Клик на элемент с obj_id=1 получим массив s_obj = [1, 13]; Повторный клик на obj_id=1 s_obj = [];
Клик на obj_id=1 - s_obj = [1, 13], клик на obj_id=13 - s_obj = [1];

SergoMorello 02.11.2017 17:46

Цитата:

Сообщение от Rasy (Сообщение 468952)
SergoMorello,

При клике на объект 13 в массиве есть элементы: 1 под индексом 0 и 13 под индексом 1.
Должен удаляться 13 элемент (индекс 1) из массива и картинка objimg_13, но первый остается нетронутым.

почему? есть же 2 условия, если нажимаем на 13 то и снова выполнится set_car_obj(1,0); и удалит первый элемент так как в массиве есть его id

if (obj==1) {set_car_obj(13,0);}
 if (obj==13) {set_car_obj(1,0);}


я тут психанул и просто взял готовую функцию для поиска элементов в массиве и на удивление с ней всё отлично работает, но почему такие траблы с indexof я так и не понял

function find(array, value) {

 for (var i = 0; i < array.length; i++) {
	if (array[i] == value) return i;
 }

return -1;
}

Nexus 02.11.2017 17:49

Попробуйте так:
var imgs={//Список данных изображений
		1:{
			src:'p_bamper_l.png',
			left:5,
			top:46
		},
		2:{
			src:'p_krilo_l.png',
			left:21,
			top:38
		}
	};

$("div#set_obj").on("click",function(e){
    set_car_obj($(this).attr("obj_id"),1);
});


function set_car_obj(id, type){
    var node=document.getElementById('objimg_'+id);
	if(!!node)
        $(node).remove();
	else{
		if(!imgs[id])
			throw new Error('Element not found');
		
		var item=imgs[id];
		$('<img/>').attr({
			src:'/img/zak_book/'+item.src,
			id:'objimg_'+id
		}).css({
			'z-index':79,
			'position':'absolute',
			'margin-left':item.left,
			'margin-top':item.top
		}).appendTo('#objblock');
    }
	
    if (type!=1)
		return;
	
	if(id==1 || id==13)
		set_car_obj(id==1?13:1,0);
	else if(id==6 || id==8)
		set_car_obj(id==6?8:6,0);
}

Rasy 02.11.2017 17:55

Цитата:

Сообщение от SergoMorello
почему? есть же 2 условия, если нажимаем на 13 то и снова выполнится set_car_obj(1,0); и удалит первый элемент так как в массиве есть его id

Нет, выполнится функция с такими аргументами set_car_obj(13, 1);

Rasy 02.11.2017 17:58

SergoMorello,
Алгоритм функции
/**

TODO:
- Определение пустого массива
- Клик на элемент set_obj. Получить число из дата-атрибута. Вызвать функцию с числом (obj_id) и флагом 1 (псевдоистинной).
- Условие. Если в массиве первый параметр (число) найден, т.е результат >= нулю, то удалить картинку с id (objimg_+первый параметр). Вырезать элемент в массиве.
- Иначе если (число) не найдено в массиве, добавить в массив первый параметр (число).
- Условие. Вставить в элемент objblock изображение с айди равным первому параметру.
- Условие. Если флаг 1 и первый параметр совпадает, то вызвать функцию с флагом 0 (псевдоложью).
- При втором вызове функции добавить в массив дополнительное число и вставить дополнительно изображение.
Т.е. клик на элемент с obj_id=1 получим массив s_obj = [1, 13]; Повторный клик на obj_id=1 s_obj = [];
- Клик на элемент set_obj с числом 13 из дата-атрибута. Вызвать фунцкию с числом (obj_id) 13 и флагом 1 (псевдоистинной)
Клик на obj_id=1 - s_obj = [1, 13], клик на obj_id=13 - s_obj = [1];
*/

Nexus 02.11.2017 18:03

Можете объяснить зачем вообще нужен массив созданных элементов?
Зачем при клике на obj_id=1 удалять obj_id=13 и наоборот?


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