Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.07.2018, 13:17
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

Помогите уменьшить содержимое функции
Добрый день. У меня есть функция которая генерирует таблицу из массива данных.
Проблема в том что помимо массива в функцию передаются еще и значения, из за которых для разных пользователей таблица выглядит по разному, хотя сам массив не меняется. Вот часть функции:

function createTable(data, str){
    var html ="";
    for (i = 0; i < data.length; i++){
        if(str == 3){
            if(data[i].st === 0 && data[i].is == 'текст1'){
            html += '<tr class="trTOJ">' +
            '<td bgcolor="#bad7ff">' + data[i].cod + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].nr + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].or + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].np + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].op + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].is + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].vr + '</td>' +
            '<td class="btn btn-info btn-ioj" id="infoOrderJournal" data1="'+data[i].nr+'" data2="'+data[i].prim+'"\n\
                >' +'Оформление'+ '</td>' +
            '</tr>';
            };
            if(data[i].st === 1 && data[i].is == 'текст1'){
                html += '<tr id="trTOJ">' +
                '<td bgcolor="#a0f0f7">' + data[i].cod + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].nr + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].or + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].np + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].op + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].is + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].vr + '</td>' +
                '<td class="btn btn-info btn-woj " id="warningOrderJournal" data1="'+data[i].nr+'" \n\
                                          data2="'+data[i].prim+'">' +'Исполнение'+ '</td>' +
                '</tr>';
            };
        }else if(str == 4){
            if(data[i].st === 0 && data[i].is == 'текст2'){
            html += '<tr class="trTOJ">' +
            '<td bgcolor="#bad7ff">' + data[i].cod + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].nr + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].or + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].np + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].op + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].is + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].vr + '</td>' +
            '<td class="btn btn-info btn-ioj" id="infoOrderJournal" data1="'+data[i].nr+'" data2="'+data[i].prim+'"\n\
                >' +'Оформление'+ '</td>' +
            '</tr>';
            };
            if(data[i].st === 1 && data[i].is == 'текст2'){
                html += '<tr id="trTOJ">' +
                '<td bgcolor="#a0f0f7">' + data[i].cod + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].nr + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].or + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].np + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].op + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].is + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].vr + '</td>' +
                '<td class="btn btn-info btn-woj " id="warningOrderJournal" data1="'+data[i].nr+'" \n\
                                          data2="'+data[i].prim+'">' +'Исполнение'+ '</td>' +
                '</tr>';
            };
        }else{
            if(data[i].st === 0){
                html += '<tr class="trTOJ">' +
                '<td bgcolor="#bad7ff">' + data[i].cod + '</td>' +
                '<td bgcolor="#bad7ff">' + data[i].nr + '</td>' +
                '<td bgcolor="#bad7ff">' + data[i].or + '</td>' +
                '<td bgcolor="#bad7ff">' + data[i].np + '</td>' +
                '<td bgcolor="#bad7ff">' + data[i].op + '</td>' +
                '<td bgcolor="#bad7ff">' + data[i].is + '</td>' +
                '<td bgcolor="#bad7ff">' + data[i].vr + '</td>' +
                '<td class="btn btn-info btn-ioj" id="infoOrderJournal" data1="'+data[i].nr+'" data2="'+data[i].prim+'"\n\
                    >' +'Оформление'+ '</td>' +
                '</tr>';
            };
            if(data[i].st === 1){
                html += '<tr id="trTOJ">' +
                '<td bgcolor="#a0f0f7">' + data[i].cod + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].nr + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].or + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].np + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].op + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].is + '</td>' +
                '<td bgcolor="#a0f0f7">' + data[i].vr + '</td>' +
                '<td class="btn btn-info btn-woj " id="warningOrderJournal" data1="'+data[i].nr+'" \n\
                                          data2="'+data[i].prim+'">' +'Исполнение'+ '</td>' +
                '</tr>';
            };
        };    
    };
    $('#table').html(html);
}


Можно ли как то ее уменьшить? тут 80% создания таблицы дублируются
и таких вот if(data[i].st === 1 && data[i].is == 'текст много штук') их может быть много.
Можно ли написать как то так:
function createTable(data, str){
    var html ="";
    for (i = 0; i < data.length; i++){
            html += '<tr class="trTOJ">' +
            '<td bgcolor="#bad7ff">' + data[i].cod + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].nr + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].or + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].np + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].op + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].is + '</td>' +
            '<td bgcolor="#bad7ff">' + data[i].vr + '</td>' +
            '<td class="btn btn-info btn-ioj" id="infoOrderJournal" data1="'+data[i].nr+'" data2="'+data[i].prim+'"\n\
                >' +'Оформление'+ '</td>' +
            '</tr>';
     };
     if(data[i].is == 'текст1'){
          //добавить только эту строку в таблицу
     }
     if(data[i].is == 'текст2'){
          //добавить только эту строку в таблицу
     }


Я понимаю что наврятли конечно, но может можно проще?
Ответить с цитированием
  #2 (permalink)  
Старый 03.07.2018, 13:27
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

сохранить одинаковое в переменную и вставлять ее!

почитайте про переменные.
https://developer.mozilla.org/ru/doc...Statements/var
Ответить с цитированием
  #3 (permalink)  
Старый 03.07.2018, 13:45
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

j0hnik,
Имеете ввиду так:
var html ="";
var a = '<td bgcolor="#bad7ff">';
var b = '<td bgcolor="#a0f0f7">';
var c = '</td>';
for (i = 0; i < data.length; i++){
        if(data[i].is == 'текст1'){
                html += '<tr class="trTOJ">' +
                a + data[i].cod + c +
                a + data[i].nr + c +
                a + data[i].or + c +
                a + data[i].np + c +
                a + data[i].op + c +
                a + data[i].is + c +
                a + data[i].vr + c +
                '<td class="btn btn-info btn-ioj" id="infoOrderJournal" 
               data1="'+data[i].nr+'" data2="'+data[i].prim+'"\n\
                    >' +'Оформление'+ '</td>' +
                '</tr>';
        }
}
Ответить с цитированием
  #4 (permalink)  
Старый 03.07.2018, 14:11
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

function createTable(data, str){
		var html ="";
		for (i = 0; i < data.length; i++){
			var color =  ['#bad7ff','#a0f0f7'];
			var arr = [];
			color.forEach((el,i)=>{
				arr[i] = '<tr id="trTOJ">' +
				'<td bgcolor="'+color[i]+'">' + data[i].cod + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].nr + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].or + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].np + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].op + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].is + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].vr + '</td>';
			});
			if(str == 3){
				if(data[i].st === 0 && data[i].is == 'текст1'){
					html += arr[0] +
					'<td class="btn btn-info btn-ioj" id="infoOrderJournal" data1="'+data[i].nr+'" data2="'+data[i].prim+'"\n\
					>' +'Оформление'+ '</td>' +
					'</tr>';
				};
				if(data[i].st === 1 && data[i].is == 'текст1'){
					html += arr[1] +'<td class="btn btn-info btn-woj " id="warningOrderJournal" data1="'+data[i].nr+'" \n\
					data2="'+data[i].prim+'">' +'Исполнение'+ '</td>' +
					'</tr>';
				};
			}else if(str == 4){
				if(data[i].st === 0 && data[i].is == 'текст2'){
					html += arr[0] + '<td class="btn btn-info btn-ioj" id="infoOrderJournal" data1="'+data[i].nr+'" data2="'+data[i].prim+'"\n\
					>' +'Оформление'+ '</td>' +
					'</tr>';
				};
				if(data[i].st === 1 && data[i].is == 'текст2'){
					html += arr[1] +'<td class="btn btn-info btn-woj " id="warningOrderJournal" data1="'+data[i].nr+'" \n\
					data2="'+data[i].prim+'">' +'Исполнение'+ '</td>' +
					'</tr>';
				};
			}else{
				if(data[i].st === 0){
					html += arr[0] + '<td class="btn btn-info btn-ioj" id="infoOrderJournal" data1="'+data[i].nr+'" data2="'+data[i].prim+'"\n\
					>' +'Оформление'+ '</td>' +
					'</tr>';
				};
				if(data[i].st === 1){
					html += arr[1] + '<td class="btn btn-info btn-woj " id="warningOrderJournal" data1="'+data[i].nr+'" \n\
					data2="'+data[i].prim+'">' +'Исполнение'+ '</td>' +
					'</tr>';
				};
			};    
		};
		$('#table').html(html);
	}


можно и так, можно и более большие куски кода сохранить
Ответить с цитированием
  #5 (permalink)  
Старый 03.07.2018, 14:16
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

j0hnik,
Круто, сейчас попробую
Я функцию написал:
function createTable(data, str){
      if(data[i].st === 0){
                html += tableTemplare(1, data[i].cod, data[i].nr, data[i].or, data[i].np, 
                data[i].op, data[i].is, data[i].vr, data[i].prim);
            };
         // и тд
}
function tableTemplare(num, cod, nr, or, np, op, is, vr, prim){
    var html ="";
    if(num == 1){
        html += '<tr class="trTOJ">' +
        '<td bgcolor="#bad7ff">' + cod + '</td>' +
        '<td bgcolor="#bad7ff">' + nr + '</td>' +
        '<td bgcolor="#bad7ff">' + or + '</td>' +
        '<td bgcolor="#bad7ff">' + np + '</td>' +
        '<td bgcolor="#bad7ff">' + op + '</td>' +
        '<td bgcolor="#bad7ff">' + is + '</td>' +
        '<td bgcolor="#bad7ff">' + vr + '</td>' +
        '<td class="btn btn-info btn-ioj" id="infoOrderJournal" data1="'+nr+'" data2="'+prim+'"\n\
            >' +'Оформление'+ '</td>' +
        '</tr>';
    };    
    return html;
}


Ваш вариант попробую применить=)
Ответить с цитированием
  #6 (permalink)  
Старый 03.07.2018, 14:23
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

function createTable(data, str){
		var html ="";
		for (i = 0; i < data.length; i++){
			var color =  ['#bad7ff','#a0f0f7'];
			var arr = [];
			color.forEach((el,i)=>{
				arr[i] = '<tr id="trTOJ">' +
				'<td bgcolor="'+color[i]+'">' + data[i].cod + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].nr + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].or + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].np + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].op + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].is + '</td>' +
				'<td bgcolor="'+color[i]+'">' + data[i].vr + '</td>';
			});
			var a = '<td class="btn btn-info btn-ioj" id="infoOrderJournal" data1="'+data[i].nr+'" data2="'+data[i].prim+'"\n\
			>' +'Оформление'+ '</td>' +
			'</tr>';
			var b = '<td class="btn btn-info btn-woj " id="warningOrderJournal" data1="'+data[i].nr+'" \n\
			data2="'+data[i].prim+'">' +'Исполнение'+ '</td>' +
			'</tr>';

			if(str == 3){
				if(data[i].st === 0 && data[i].is == 'текст1')html += arr[0]+a;
				if(data[i].st === 1 && data[i].is == 'текст1')html += arr[1]+b;
			}
			else if(str == 4){
				if(data[i].st === 0 && data[i].is == 'текст2')html += arr[0]+a;
				if(data[i].st === 1 && data[i].is == 'текст2')html += arr[1]+b;
			}
				else{
					if(data[i].st === 0)html += arr[0] + a;
					if(data[i].st === 1)html += arr[1] + b;
				}
			}
			$('#table').html(html);
		}


если прям по максимум надо, можно и оставшиеся хвосты сжать.
Ответить с цитированием
  #7 (permalink)  
Старый 03.07.2018, 14:30
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

j0hnik,
Теперь понял что вы имели ввиду, спасибо
Ответить с цитированием
  #8 (permalink)  
Старый 03.07.2018, 14:47
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

Всем здравствуйте!
А может такой вариант подойдет?
function createTable(data, str){
    var html = "" tr = "", td;
	var data_st=[{
			color: "#bad7ff",
			btn_class: "btn-ioj",
			id: "infoOrderJournal",
			stat: "Оформление"
		},{
			color: "#a0f0f7",
			btn_class: "btn-woj",
			id: "warningOrderJournal",
			stat: "Исполнение"
		}];
	
    for (i = 0; i < data.length; i++){
		if (data[i].st === 0 || data[i].st === 1){//Нужна ли эта проверка? data[i].st м.б. еще чему-то равно?
			td = data_st[data[i].st];
			tr = '<tr class="trTOJ">' +
				'<td bgcolor=' + td.color + '>' + data[i].cod + '</td>' +
				'<td bgcolor=' + td.color + '>' + data[i].nr + '</td>' +
				'<td bgcolor=' + td.color + '>' + data[i].or + '</td>' +
				'<td bgcolor=' + td.color + '>' + data[i].np + '</td>' +
				'<td bgcolor=' + td.color + '>' + data[i].op + '</td>' +
				'<td bgcolor=' + td.color + '>' + data[i].is + '</td>' +
				'<td bgcolor=' + td.color + '>' + data[i].vr + '</td>' +
				'<td class="btn btn-info ' + td.btn_class + '" id="' + td.id + '" data1="'+data[i].nr+'" data2="'+data[i].prim+'"\n\
					>' +td.stat '</td>' +
				'</tr>';
			
			if((str == 3 && data[i].is == 'текст1') || (str == 4 && data[i].is == 'текст2') || (str != 3 && str != 4)){
				html += tr;
			}
		} 
    };
    $('#table').html(html);
}
Ответить с цитированием
  #9 (permalink)  
Старый 03.07.2018, 14:53
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

j0hnik,
Вот это я переделал, во время обработки цвета, надо букву было поменять, иначе по массиву только 2 раза проходился:
function createTable(data, str){
		var html ="";
		for (i = 0; i < data.length; i++){
			var color =  ['#bad7ff','#a0f0f7'];
			var arr = [];
			color.forEach((el,s)=>{
				arr[s] = '<tr id="trTOJ">' +
				'<td bgcolor="'+color[s]+'">' + data[i].cod + '</td>' +
				'<td bgcolor="'+color[s]+'">' + data[i].nr + '</td>' +
				'<td bgcolor="'+color[s]+'">' + data[i].or + '</td>' +
				'<td bgcolor="'+color[s]+'">' + data[i].np + '</td>' +
				'<td bgcolor="'+color[s]+'">' + data[i].op + '</td>' +
				'<td bgcolor="'+color[s]+'">' + data[i].is + '</td>' +
				'<td bgcolor="'+color[s]+'">' + data[i].vr + '</td>';
			});
			var a = '<td class="btn btn-info btn-ioj" id="infoOrderJournal" data1="'+data[i].nr+'" data2="'+data[i].prim+'"\n\
			>' +'Оформление'+ '</td>' +
			'</tr>';
			var b = '<td class="btn btn-info btn-woj " id="warningOrderJournal" data1="'+data[i].nr+'" \n\
			data2="'+data[i].prim+'">' +'Исполнение'+ '</td>' +
			'</tr>';

			if(str == 3){
				if(data[i].st === 0 && data[i].is == 'текст1')html += arr[0]+a;
				if(data[i].st === 1 && data[i].is == 'текст1')html += arr[1]+b;
			}
			else if(str == 4){
				if(data[i].st === 0 && data[i].is == 'текст2')html += arr[0]+a;
				if(data[i].st === 1 && data[i].is == 'текст2')html += arr[1]+b;
			}
				else{
					if(data[i].st === 0)html += arr[0] + a;
					if(data[i].st === 1)html += arr[1] + b;
				}
			}
			$('#table').html(html);
		}


Это использую, все отлично работает =)
Ответить с цитированием
  #10 (permalink)  
Старый 03.07.2018, 14:55
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

Manyasha,
Там ИЛИ не как использовать нельзя, предыдущий вариант отлично подошел
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать метод функции по клику элемента, созданного в этой функции? polinin Общие вопросы Javascript 4 26.10.2017 14:07
JS классы - как объединить функции в класс olga153b Events/DOM/Window 3 01.11.2011 14:13
Как в браузерах реализуются функции DOM (например createElement) iamme Общие вопросы Javascript 7 02.09.2011 20:26
помогите с повторением функции getJSON kichSman jQuery 1 21.04.2011 00:50
Реализация функции JavaScript, меняющей содержимое ячеек таблицы по событию onchange BOJIKOJIAK Events/DOM/Window 1 24.05.2010 05:50