03.07.2018, 13:17
|
Профессор
|
|
Регистрация: 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'){
//добавить только эту строку в таблицу
}
Я понимаю что наврятли конечно, но может можно проще?
|
|
03.07.2018, 13:45
|
Профессор
|
|
Регистрация: 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>';
}
}
|
|
03.07.2018, 14:11
|
|
Профессор
|
|
Регистрация: 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);
}
можно и так, можно и более большие куски кода сохранить
|
|
03.07.2018, 14:16
|
Профессор
|
|
Регистрация: 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;
}
Ваш вариант попробую применить=)
|
|
03.07.2018, 14:23
|
|
Профессор
|
|
Регистрация: 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);
}
если прям по максимум надо, можно и оставшиеся хвосты сжать.
|
|
03.07.2018, 14:30
|
Профессор
|
|
Регистрация: 13.03.2018
Сообщений: 278
|
|
j0hnik,
Теперь понял что вы имели ввиду, спасибо
|
|
03.07.2018, 14:47
|
Профессор
|
|
Регистрация: 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);
}
|
|
03.07.2018, 14:53
|
Профессор
|
|
Регистрация: 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);
}
Это использую, все отлично работает =)
|
|
03.07.2018, 14:55
|
Профессор
|
|
Регистрация: 13.03.2018
Сообщений: 278
|
|
Manyasha,
Там ИЛИ не как использовать нельзя, предыдущий вариант отлично подошел
|
|
|
|