Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите уменьшить содержимое функции (https://javascript.ru/forum/misc/74344-pomogite-umenshit-soderzhimoe-funkcii.html)

Artur_Hopf 03.07.2018 13:17

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

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'){
          //добавить только эту строку в таблицу
     }


Я понимаю что наврятли конечно, но может можно проще? :-?

j0hnik 03.07.2018 13:27

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

почитайте про переменные.
https://developer.mozilla.org/ru/doc...Statements/var

Artur_Hopf 03.07.2018 13:45

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

j0hnik 03.07.2018 14:11

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


можно и так, можно и более большие куски кода сохранить

Artur_Hopf 03.07.2018 14:16

j0hnik,
Круто, сейчас попробую:thanks:
Я функцию написал:
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;
}


Ваш вариант попробую применить=)

j0hnik 03.07.2018 14:23

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


если прям по максимум надо, можно и оставшиеся хвосты сжать.

Artur_Hopf 03.07.2018 14:30

j0hnik,
Теперь понял что вы имели ввиду, спасибо :thanks:

Manyasha 03.07.2018 14:47

Всем здравствуйте!
А может такой вариант подойдет?
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);
}

Artur_Hopf 03.07.2018 14:53

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


Это использую, все отлично работает =) :thanks:

Artur_Hopf 03.07.2018 14:55

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


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