помощь с выводом данных из одного массива в другой
Здравствуйте.
И всех с Новым Годом! Возможно я не совсем правильно сформулировал вопрос... попробую подробнее рассказать. Сделал небольшой калькулятор. В одном из блоков выводится информация по материалам, их стоимости и количестве. Элементы выводятся по сути списком. Количество элементов разное и у них могут отличаться наименования используемых материалов. В общем список эток динамический. Выглядит он в конечном счете вот так
<ul class="materials_data_ul">
<li class="materials_li materials_header_li">
<span class="material_label">Наименование</span>
<span class="material_amount">Количество</span>
<span class="material_summ">Стоимость</span>
</li>
<li class="materials_li">
<span class="material_label">Клей-пена, 600 мл</span>
<span class="material_amount">2</span>
<span class="material_summ">910</span>
</li>
<li class="materials_li">
<span class="material_label">Герметик акрилатный, ведро/15кг</span>
<span class="material_amount">1</span>
<span class="material_summ">2 275</span>
</li>
</ul>
После того как расчет сделан, мне нужно сформировать PDF файл с коммерческим предложением. Для этого я использую pdfmaker (http://pdfmake.org) И собственно задача вывести данные из этого списка в таблицу. Но ничего у меня не получается. Я написал небольшую функцию, которая перебирает все элементы списка и добавляет информацию нужного вида в массив.
var arr = [];
$('.materials_li').each(function() {
var printName = $(this).find('.material_label').text();
var printAmount = Number($(this).find('.material_amount').text().replace(/\D+/g,""));
var printSumm = Number($(this).find('.material_summ').text().replace(/\D+/g,""));
var printPrice = printSumm/printAmount;
var printTable = '"'+printName + '", "' + printAmount + '", "' + printSumm.toFixed(2) + '", "' + printPrice.toFixed(2) + '"';
arr.push(printTable);
});
console.log(arr[2]);
console.log(arr[2]); выводит "Герметик акрилатный, ведро/15кг", "1", "2275.00", "2275.00" В pdfmaker данные в таблицу заносятся таким вот образом, по сути тоже массив
table: {
widths: ['46%', '18%', '18%', '18%'],
body: [
["Наименование", "Кол-во", "Цена", "Сумма"],
[arr[2]]
]
},
Содержимое arr[2] - соответсвует формату, который там должен быть. Но [arr[2]] вызывает ошибку. Хотя вывод определенного элемента массива тоже вариант так себе, потому что я не знаю заранее сколько элементов будет в массиве. По хорошему прямо в таблице нужно цикл делать, но у меня ничего не получается... В целом PDF файл задается таким вот кодом
var pdfDoc = {
pageSize:'A4',
pageOrientation:'portrait',//'portrait'
pageMargins:[20,10,20,10],
content: [
{
columns: [
{
fontSize: 20,
bold: true,
width: '50%',
text: 'HARDEK'
},
{
width: '50%',
fontSize: 12,
alignment: 'right',
margin: [0, 8, 0, 0],
text: '8 (3452) 93-47-22'
}
]
},
{
columns: [
{
fontSize: 10,
width: '50%',
text: 'производственная компания'
},
{
width: '50%',
fontSize: 12,
alignment: 'right',
text: 'www.hardek.ru'
}
]
},
{
text: '______________________________________________________________________________________________________',
alignment: 'center'
},
{
text: 'ИСХОДНЫЕ ДАННЫЕ',
fontSize: 12,
bold: true,
alignment: 'center',
margin: [0, 100, 0, 20]
},
{
table: {
widths: ['70%', '30%'],
body: [
['Площадь фасада, м2', square],
['Материал панелей', printMaterial],
['Толщина утеплителя, мм', printUteplitel],
['Модель термопанели', printModel],
['Материал стен', printStena]
]
},
layout: {
hLineWidth: function (i, node) {
return (i == 1 || i == 2 || i == 3 || i == 4 || i == 5) ? 1 : 0;
},
vLineWidth: function () {
return (0);
},
}
},
{
text: 'КОММЕРЧЕСКОЕ ПРЕДЛОЖЕНИЕ',
fontSize: 12,
bold: true,
alignment: 'center',
margin: [0, 100, 0, 20]
},
{
table: {
widths: ['46%', '18%', '18%', '18%'],
body: [
["Наименование", "Кол-во", "Цена", "Сумма"],
]
},
}
]
};
|
Понял в чем проблема, но как решить пока не понял.
в этой конструкции
table: {
widths: ['46%', '18%', '18%', '18%'],
body: [
["Наименование", "Кол-во", "Цена", "Сумма"],
]
},
в боди ожидается что в каждую строку будет передаваться 4 элемента и тот элемент что я передаю соответственно считается как один, а в строке должно быть 4. из за этого ошибка. получается мой список нужно разбивать не на целые строки, а делать многомерный массив. но как потом выводить - не понятно... |
the_little,
table.body.concat(arr); |
Цитата:
body: [
]
? выдает ошибку table is not defined
table: {
body: [
table.body.concat(arr)
]
},
|
Пробую так
table: {
body: [
[
function() {
return table.body.concat(arr)
}
]
]
},
Ошибок нет, но ничего не выдает |
нашел небольшой пример, и он даже рабочий, но только там выводят строки, где каждый элемент массива - отделная строка
и даже получилось. Я сделал многомерный массив. Внутри массива идут соответсвенно тоже массивы, в каждом значения переменных.
table: {
body:
arr.map(function(item) {
return [ {text: item} ];
})
},
в результате получил свои строки в таблице. Но вот как теперь эти строки разбить на ячейки в этом коде я не понимаю... Сейчас в таблице такие строки Наименование0NaN0 Клей-пена, 600 мл1455455 Герметик акрилатный, ведро/15кг122752275 Грунт глубокого проникновения, 10л1330330 Краска фасадная, ведро/20кг133803380 Саморез 6*60мм161.937531 Поддоны, шт.110001000 Вот эта функция как я понимаю выводит
arr.map(function(item) {
return [ {text: item} ];
})
здесь же item - это получается мой массив, который выводится в виде текста. а мне надо получается что-то типа "1","2","3","4" вместо {text: item} "1234" |
the_little,
не понимаю, слишком много букв, нужно есть такая структура, как получить такую, исходные данные и конечные, и всё. пока, более поста #3, мне добавить нечего. ждите с более продвинутым скилом ванги, или попытайтесь локализовать задачу. |
Цитата:
Используя данные из HTML создать таблицу в PDF файле. вот и вся задача. |
| Часовой пояс GMT +3, время: 20:00. |