помощь с выводом данных из одного массива в другой
Здравствуйте.
И всех с Новым Годом! Возможно я не совсем правильно сформулировал вопрос... попробую подробнее рассказать. Сделал небольшой калькулятор. В одном из блоков выводится информация по материалам, их стоимости и количестве. Элементы выводятся по сути списком. Количество элементов разное и у них могут отличаться наименования используемых материалов. В общем список эток динамический. Выглядит он в конечном счете вот так <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, время: 01:53. |