AndiMandi
@AndiMandi
Вроде юн, а уже на заводе :)

Вставить значения из JSON в таблицу?

Я пытаюсь вставить из JSON-объекта "УДЕРЖАНО" значения в таблицу, но ничего не помогает. Очень многое перепробовал, но я уже просто не знаю, как это сделать, не меняя структуру таблицы. Сам код:
document.addEventListener('DOMContentLoaded', function() {
    var responseData = [
        {
            "ШАПКА": [
            {
                "ТабНомер": "20511",
                "Сотрудник": "Димаков Андрей Владиславович",
                "Заголовок": "Ноябрь 2023",
                "ОбщийОблагаемыйДоход": 236899.94,
                "Должность": "техник ИВЦ ",
                "Подразделение": "отдел 23. Группа проектирования и сопровождения информационных систем",
                "Организация": "АО \"ПО \"СЕВЕР\"",
                "КВыплате": 14297.23
            }]
        },
        {
            "НАЧИСЛЕНО": [
            {
                "ВидНачисления": "Оклад по чаcам",
                "ПериодНачисления": "Ноябрь 2023",
                "ОтработанныеДни": 16,
                "ОтработанныеЧасы": 127.2,
                "ОплаченныеДни": 0,
                "ОплаченныеЧасы": 127.2,
                "СуммаНачисления": 14150.24
            },
            {
                "ВидНачисления": "Оплата отпуска по календарным дням",
                "ПериодНачисления": "Ноябрь 2023",
                "ОтработанныеДни": 0,
                "ОтработанныеЧасы": 0,
                "ОплаченныеДни": 5,
                "ОплаченныеЧасы": 0,
                "СуммаНачисления": 3398.9
            },
            {
                "ВидНачисления": "ИСН",
                "ПериодНачисления": "Ноябрь 2023",
                "ОтработанныеДни": 0,
                "ОтработанныеЧасы": 0,
                "ОплаченныеДни": 0,
                "ОплаченныеЧасы": 127.2,
                "СуммаНачисления": 6846.89
            },
            {
                "ВидНачисления": "Индексирующая выплата",
                "ПериодНачисления": "Ноябрь 2023",
                "ОтработанныеДни": 0,
                "ОтработанныеЧасы": 0,
                "ОплаченныеДни": 0,
                "ОплаченныеЧасы": 127.2,
                "СуммаНачисления": 1443.17
            },
            {
                "ВидНачисления": "Районный коэффициент",
                "ПериодНачисления": "Ноябрь 2023",
                "ОтработанныеДни": 0,
                "ОтработанныеЧасы": 0,
                "ОплаченныеДни": 0,
                "ОплаченныеЧасы": 0,
                "СуммаНачисления": 5610.08,
                "ВсегоНачислено": 31449.28
            }]
        },
        {
            "УДЕРЖАНО": [
            {
                "ВидУдержания": "НДФЛ исчисленный",
                "ПериодУдержания": null,
                "СуммаУдержания": 4088
            },
            {
                "ВидУдержания": null,
                "ПериодУдержания": null,
                "СуммаУдержания": null
            },
            {
                "ВидУдержания": null,
                "ПериодУдержания": null,
                "СуммаУдержания": null
            },
            {
                "ВидУдержания": null,
                "ПериодУдержания": null,
                "СуммаУдержания": null
            },
            {
                "ВидУдержания": null,
                "ПериодУдержания": null,
                "СуммаУдержания": null
            },
            {
                "ВсегоУдержано": 4088
            }]
        },
        {
            "ВЫПЛАЧЕНО": [
            {
                "ВидВыплаты": "Отпускные (перечислено в банк)",
                "ПериодВыплаты": "09.11.2023",
                "СуммаВыплаты": 2956.9
            },
            {
                "ВидВыплаты": "Зарплата (перечислено в банк)",
                "ПериодВыплаты": "10.11.2023",
                "СуммаВыплаты": 20066.91
            },
            {
                "ВидВыплаты": "Аванс (перечислено в банк)",
                "ПериодВыплаты": "24.11.2023",
                "СуммаВыплаты": 10107.15
            },
            {
                "ВсегоВыплачено": 33130.96
            }]
        },
        {
            "ПОДВАЛ": [
            {
                "СуммаДолгНаКонецПериода": 14297.23,
                "СуммаДолгНаНачалоПериода": 20066.91
            }]
        }
    ];
        var container = document.getElementById('otvet');
        container.innerHTML = `
        
<table class="tg">
<tbody>
<tr>
<td class="tg-jxgv" colspan="8" style="border-style: none;"> </td>
<td class="tg-jxgv" colspan="7" style="border-style: none;"></td>
</tr>
<tr>
<td class="tg-oqqy" rowspan="2">Вид</td>
<td class="tg-s9fd" colspan="2" rowspan="2">Период</td>
<td class="tg-s9fd" colspan="2">Отработано</td>
<td class="tg-s9fd" colspan="2">Оплачено</td>
<td class="tg-s9fd" rowspan="2">Сумма</td>
<td class="tg-oqqy" colspan="3" rowspan="2">Вид</td>
<td class="tg-s9fd" colspan="2" rowspan="2">Период</td>
<td class="tg-s9fd" colspan="2" rowspan="2">Сумма</td>
</tr>
<tr>
<td class="tg-s9fd">Дни</td>
<td class="tg-s9fd">Часы</td>
<td class="tg-s9fd">Дни</td>
<td class="tg-s9fd">Часы</td>
</tr>
<tr>
<td class="tg-pdeq" colspan="8">1.Начислено</td>
<td class="tg-pdeq" colspan="7">2. Удержано</td>
</tr>
<!-- Чисто по циклу пройтись. <b>Вот на это стоит обратить внимание </b>-->
${responseData.map(dataBlock => {
    const начислено = dataBlock["НАЧИСЛЕНО"] || [];
    const удержано = dataBlock["УДЕРЖАНО"] || [];

    if (начислено.length > 0 || удержано.length > 0) {
        return начислено.map(item => {
            const видНачисления = item["ВидНачисления"] || "";
            const периодНачисления = item["ПериодНачисления"] || "";
            const отработанныеДни = item["ОтработанныеДни"] || "";
            const отработанныеЧасы = item["ОтработанныеЧасы"] || "";
            const оплаченныеДни = item["ОплаченныеДни"] || "";
            const оплаченныеЧасы = item["ОплаченныеЧасы"] || "";
            const суммаНачисления = item["СуммаНачисления"] || "";
        
            // Поиск соответствующего удержания по Виду начисления
            const удержание = удержано.find(u => u["ВидУдержания"] !== null && u["ВидУдержания"] !== undefined);
            
            const видУдержания = удержание ? удержание["ВидУдержания"] || "" : "";
            const периодУдержания = удержание ? удержание["ПериодУдержания"] || "" : "";
            const суммаУдержания = удержание ? удержание["СуммаУдержания"] || "" : "";
            
            console.log("удержание:", удержание);
            console.log("видУдержания:", видУдержания);
            console.log("периодУдержания:", периодУдержания);
            console.log("суммаУдержания:", суммаУдержания);

            if (удержание) {
                видУдержания = удержание["ВидУдержания"] || "";
                периодУдержания = удержание["ПериодУдержания"] || "";
                суммаУдержания = удержание["СуммаУдержания"] || "";
            }
        
            return `
                <tr>
                    <td class="tg-jxgv">${видНачисления}</td>
                    <td class="tg-l38m" colspan="2">${периодНачисления}</td>
                    <td class="tg-l38m">${отработанныеДни}</td>
                    <td class="tg-l38m">${отработанныеЧасы}</td>
                    <td class="tg-l38m">${оплаченныеДни}</td>
                    <td class="tg-l38m">${оплаченныеЧасы}</td>
                    <td class="tg-l38m">${суммаНачисления}</td>
        
                    <td class="tg-jxgv" colspan="3">${видУдержания}</td>
                    <td class="tg-jxgv" colspan="2">${периодУдержания}</td>
                    <td class="tg-l38m" colspan="2">${суммаУдержания}</td>
                </tr>`;
        }).join('');
    } else {
        return '';
    }
}).join('')}
<!-- Конец цикла -->
<td class="tg-jxgv" colspan="7">Всего начислено</td>
<td class="tg-l38m">31 449,28</td>
<td class="tg-jxgv" colspan="5">Всего удержано</td>
<td class="tg-l38m" colspan="2">4 088,00</td>
</tr>
<tr>
<td class="tg-pdeq">3.&nbsp;&nbsp;&nbsp;Доходы в натуральной форме</td>
<td class="tg-pdeq" colspan="2"></td>
<td class="tg-pdeq"></td>
<td class="tg-pdeq"></td>
<td class="tg-pdeq"></td>
<td class="tg-pdeq"></td>
<td class="tg-pdeq"></td>
<td class="tg-pdeq" colspan="7">4. Выплаченные суммы</td>
</tr>
<tr>
<td class="tg-jxgv"> </td>
<td class="tg-l38m" colspan="2"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-jxgv" colspan="3">Аванс (перечислено в&nbsp;&nbsp;&nbsp;банк)</td>
<td class="tg-l38m"
colspan="2">24.11.23</td>
<td class="tg-l38m" colspan="2">10 107,15</td>
</tr>
<tr>
<td class="tg-jxgv"> </td>
<td class="tg-l38m" colspan="2"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-jxgv" colspan="3">Зарплата (перечислено&nbsp;&nbsp;&nbsp;в банк)</td>
<td class="tg-l38m" colspan="2">10.11.23</td>
<td class="tg-l38m" colspan="2">20 066,91</td>
</tr>
<tr>
<td class="tg-jxgv"> </td>
<td class="tg-l38m" colspan="2"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-l38m"> </td>
<td class="tg-jxgv" colspan="3">Отпускные&nbsp;&nbsp;&nbsp;(перечислено в банк)</td>
<td class="tg-l38m" colspan="2">09.11.23</td>
<td class="tg-l38m" colspan="2">2 956,90</td>
</tr>
<tr>
<td class="tg-jxgv" colspan="7">Всего натуральных доходов</td>
<td class="tg-l38m"> </td>
<td class="tg-jxgv" colspan="5">Всего выплат</td>
<td class="tg-l38m" colspan="2">33 130,96</td>
</tr>
</tbody>
</table>
        `;
        console.log(responseData);
});

Как сама выглядит таблица: 65880fab1b73e167275180.png
Стили для таблицы оставлю в комментариях.
  • Вопрос задан
  • 874 просмотра
Решения вопроса 1
IvanU7n
@IvanU7n
структура странная так просто с ней не поработаешь (решение примерное)

перед присвоением container.innerHTML нужно подготовить данные для параллельного прохода по ним:
const nachisleno = responseData.find(i => i.НАЧИСЛЕНО).НАЧИСЛЕНО;
const uderzhano = responseData.find(i => i.УДЕРЖАНО).УДЕРЖАНО;
const upperRows = function*(){
  for (let i = 0; i < Math.max(nachisleno.length, uderzhano.length); i += 1) {
    yield [ nachisleno[i] ?? {}, uderzhano[i] ?? {}, ];
  }
};

а потом внутри шаблонной строки responseData.map() заменить на
${Array.from(upperRows()).map(item => {
  const видНачисления = item[0]["ВидНачисления"] || "";
  const периодНачисления = item[0]["ПериодНачисления"] || "";
  const отработанныеДни = item[0]["ОтработанныеДни"] || "";
  const отработанныеЧасы = item[0]["ОтработанныеЧасы"] || "";
  const оплаченныеДни = item[0]["ОплаченныеДни"] || "";
  const оплаченныеЧасы = item[0]["ОплаченныеЧасы"] || "";
  const суммаНачисления = item[0]["СуммаНачисления"] || "";
        
  const видУдержания = item[1]["ВидУдержания"] || "";
  const периодУдержания = item[1]["ПериодУдержания"] || "";
  const суммаУдержания = item[1]["СуммаУдержания"] || "";
            
  return `
    <tr>
      <td class="tg-jxgv">${видНачисления}</td>
      <td class="tg-l38m" colspan="2">${периодНачисления}</td>
      <td class="tg-l38m">${отработанныеДни}</td>
      <td class="tg-l38m">${отработанныеЧасы}</td>
      <td class="tg-l38m">${оплаченныеДни}</td>
      <td class="tg-l38m">${оплаченныеЧасы}</td>
      <td class="tg-l38m">${суммаНачисления}</td>
        
      <td class="tg-jxgv" colspan="3">${видУдержания}</td>
      <td class="tg-jxgv" colspan="2">${периодУдержания}</td>
      <td class="tg-l38m" colspan="2">${суммаУдержания}</td>
    </tr>
  `;
}).join('')}


Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@alexsmirnovdotcom
Не по поводу решения, но реальные данные нужно затирать когда показываете пример.
Вы и ваша организация могут попасть на крупный штраф...

Плюс человеку тоже не хотелось бы наверное, чтобы его зп и прочие данные светились в интернете.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы