Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   помощь с выводом данных из одного массива в другой (https://javascript.ru/forum/misc/76370-pomoshh-s-vyvodom-dannykh-iz-odnogo-massiva-v-drugojj.html)

the_little 05.01.2019 15:32

помощь с выводом данных из одного массива в другой
 
Здравствуйте.
И всех с Новым Годом!

Возможно я не совсем правильно сформулировал вопрос... попробую подробнее рассказать.

Сделал небольшой калькулятор.
В одном из блоков выводится информация по материалам, их стоимости и количестве.

Элементы выводятся по сути списком. Количество элементов разное и у них могут отличаться наименования используемых материалов.

В общем список эток динамический.

Выглядит он в конечном счете вот так

<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: [
                        ["Наименование", "Кол-во", "Цена", "Сумма"],
                    ]
                },
            }
        ]
    };

the_little 05.01.2019 16:57

Понял в чем проблема, но как решить пока не понял.
в этой конструкции
table: {
                    widths: ['46%', '18%', '18%', '18%'],
                    body: [
                        ["Наименование", "Кол-во", "Цена", "Сумма"],
                    ]
                },

в боди ожидается что в каждую строку будет передаваться 4 элемента

и тот элемент что я передаю соответственно считается как один, а в строке должно быть 4.
из за этого ошибка.

получается мой список нужно разбивать не на целые строки, а делать многомерный массив.
но как потом выводить - не понятно...

рони 05.01.2019 17:51

the_little,

table.body.concat(arr);

the_little 05.01.2019 18:08

Цитата:

Сообщение от рони (Сообщение 501366)
the_little,

table.body.concat(arr);

Это нужно вставить внутри
body: [
      
]

?
выдает ошибку table is not defined

table: {
                    body: [
                        table.body.concat(arr)
                    ]
                },

the_little 05.01.2019 18:19

Пробую так
table: {
                    body: [
                        [
                            function() {
                                return table.body.concat(arr)
                            }
                        ]
                    ]
                },


Ошибок нет, но ничего не выдает

the_little 05.01.2019 18:39

нашел небольшой пример, и он даже рабочий, но только там выводят строки, где каждый элемент массива - отделная строка

и даже получилось.

Я сделал многомерный массив. Внутри массива идут соответсвенно тоже массивы, в каждом значения переменных.

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"

рони 05.01.2019 19:36

the_little,
не понимаю, слишком много букв, нужно
есть такая структура, как получить такую, исходные данные и конечные, и всё.
пока, более поста #3, мне добавить нечего.
ждите с более продвинутым скилом ванги, или попытайтесь локализовать задачу.

the_little 05.01.2019 22:11

Цитата:

Сообщение от рони (Сообщение 501374)
the_little,
не понимаю, слишком много букв, нужно
есть такая структура, как получить такую, исходные данные и конечные, и всё.
пока, более поста #3, мне добавить нечего.
ждите с более продвинутым скилом ванги, или попытайтесь локализовать задачу.

да собственно задача то простая.
Используя данные из HTML создать таблицу в PDF файле.
вот и вся задача.


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