В чем ошибка? Uncaught TypeError: Cannot read property '0' of undefined

Работало всё до этого хорошо, зашла показать как это работает, а тут такое:

Uncaught TypeError: Cannot read property '0' of undefined at HTMLButtonElement.btn.onclick (Proect.js:48)

Помогите пожалуйста, понять что произошло.

function getModalTableRow(Data, trow) {
  return Object.keys(Data).reduce((acc, item) => {
    let modaltd = document.createElement("td");

    modaltd.className = "modaltd";
    modaltd.innerText = Data[item];

    acc.appendChild(modaltd);

    return acc;
  }, trow);
}

function getTableRows(data, row) {
  console.log(data, row);
  return Object.keys(data).reduce((acc, item) => {
    let td = document.createElement("td");

    if (typeof data[item].data !== "object") {
      td.className = "col";
      td.innerText = data[item];
    } else {
      td.id = "btnview";
      const buttonView = document.createElement("button");
      buttonView.innerText = "view";
      buttonView.id = data[item].id;

      buttonView.className = "view";

      td.appendChild(buttonView);
    }

    acc.appendChild(td);

    return acc;
  }, row);
}

function getTableColumnName(data, row) {
  console.log(data, row);
  return data.reduce((acc, item) => {
    let th = document.createElement("th");
    th.className = "thname";
    th.innerText = item;

    acc.appendChild(th);

    return acc;
  }, row);
}

let btn = document.querySelector("button");
let textarea = document.querySelector("textarea");
let centerBox = document.querySelector(".center-box");
let table = document.querySelector("table");
let myjson = {};
const modal = document.querySelector(".modal-box");
const closeButton = document.querySelector(".close-button");
const modalTable = document.querySelector(".modal-content table");

window.onload = function () {
  table.onclick = function (event) {
    if (event.target.className === "view") {
      modalTable.innerHTML = "";

      let trHead = document.createElement("tr");
      let trBody = document.createElement("tr");

      const targetId = event.target.id;
      const modalData = myjson.CyberPunk.find(
        (item) => item.attachments.id == targetId
      ).attachments.data;
      const modalkeys = Object.keys(modalData);
      const newModalTh = getModalTableRow(modalkeys, trHead);
      const newModalTr = getModalTableRow(modalData, trBody);

      modalTable.appendChild(newModalTh);
      modalTable.appendChild(newModalTr);

      modal.classList.add("modal-visible");
    }
  };

  modal.onclick = function () {
    modal.classList.remove("modal-visible");
  };

  closeButton.onclick = function () {
    modal.classList.remove("modal-visible");
  };

  btn.onclick = function () {
    myjson = JSON.parse(textarea.value);

    centerBox.classList.add("hide-center-box");

    if (textarea.value !== "") {
      const headTr = document.createElement("tr");
      const nameColumns = Object.keys(myjson.CyberPunk[0]);
      const tableHeadColumn = getTableColumnName(nameColumns, headTr);

      table.appendChild(tableHeadColumn);

      for (i = 0; i < myjson.CyberPunk.length; i++) {
        let tr = document.createElement("tr");
        const newTr = getTableRows(myjson.CyberPunk[i], tr);

        table.appendChild(newTr);
      }
    } else {
      alert("Вы не добавили JSON файл!");
      centerBox.classList.remove("hide-center-box");
    }
  };
};
main {
    width: 100%;
    height: calc(100vh - 80px);
    background: url(original.jpg) no-repeat;
    background-size: cover;
    overflow: hidden;
    background-attachment: scroll;
}

body {
    margin: 0;
    padding: 0;
}

header {
    z-index: 1;
    height: 80px;
    background-color: rgba(55, 71, 84, 0.9);
    display: flex;
    flex-direction: row;
    justify-content: center;
    color: white;
    align-items: center;
    text-shadow: 2px 2px 3px black;
}

.logo {
    padding: 4px;
}

.logo-icon {
    height: 50px;
}

.head-text p {
    font-size: 25px;
    color: #ffffff;
    padding: 4px;
}

.textarea-box textarea {
    width: 100%;
    height: 80px;
}

.center-box {
    z-index: 1;
    position: absolute;
    top: 50%;
    left: 50%;
    margin-right: -50%;
    transform: translate(-50%, -50%);
    padding: 5px;
    width: 500px;
    height: auto;
    overflow: hidden;
    background-color: rgba(55, 71, 84, 0.9);
    color: white;
}

.center-box div {
    margin: 0px 15px 20px 10px;
}

.transformButton-box {
    display: flex;
    justify-content: center;
}

.transformButton-box button {
    color: white;
    background-color: #65c7d0;
    font-size: 15px;
    padding: 10px;
    font-weight: bold;
    border: none;
    text-shadow: 1px 1px 2px black;
    border-radius: 5px;
    outline: none;
}

.transformButton-box button:active {
    border: none;
    outline: none;
    background-color: white;
    color: #65c7d0;
}

.transformButton-box button:hover {
    background-color: #478e94;
    outline: none;
}

.textarea-box textarea {
    cursor: pointer;
    width: 100%;
    height: 130px;
    resize: none;
    justify-content: center;
    background-color: rgba(55, 71, 84, 0.9);
    color: #65c7d0;
    font-size: 14px;
    border: none;
    outline: none;
}
#textplaceholder::placeholder {
    color: white;
}



.description-box span {
    font-size: 18px;
    padding: 8px;
    color: #65c7d0;
}

footer {
    z-index: 1;
    background-color: rgba(55, 71, 84, 0.9);
    position: absolute;
    bottom: 0;
    width: 100%;
    height: 80px;
    display: flex;
    flex-direction: row;
    justify-content: space-between;
    color: white;
    align-items: center;
}

.logo {
    align-items: flex-start;
}

.logo-block {
    display: flex;
    align-items: center;
    padding-left: 20px;
}

.flogo-icon {
    height: 35px;
}

.fhead-text p {
    font-size: 20px;
    color: #ffffff;
    text-shadow: 2px 2px 3px black;
}

.copyright {
    font-size: 17px;
    color: #65c7d0;
    padding-right: 20px;
}

.cyber-table {
    position: absolute;
    top: 50%;
    left: 50%;
    margin-right: -50%;
    transform: translate(-50%, -50%);
    background-color: rgb(0, 0, 0, 0.8);
    color: #65c7d0;
    /* text-shadow: 2px 2px 3px #65c7d0; */
    font-size: 20px;
}


.cyber-table td {
    padding: 10px;
}

.cyber-table tr :nth-child(odd) {
    background-color: rgba(55, 71, 84, 0.7);
}

.cyber-table tr :nth-child(even) {
    background-color: rgb(46, 74, 98, 0.7);
}

.thname {
    font-size: 22px;
    font-weight: normal;
    text-transform: uppercase;
    padding: 10px;
    color: #65c7d0;
    text-shadow: 2px 2px 3px black;
}

.hide-center-box {
    visibility: hidden;
}

.modal-box {
    visibility: hidden;
    z-index: 2;
    display: flex;
    justify-content: center;
    align-items: center;
    position: absolute;
    background-color: rgb(0, 0, 0, 0.5);
    height: calc(100vh - 80px);
    width: 100%;
}

.modal-visible{
    visibility: visible;
}

.modal {
    height: 15vh;
    width: 40vw;
    background-color:rgba(55, 71, 84);
     display: flex;
    justify-content:center;
    align-items: center;
    flex-direction: column;
}

.modal-header {
    flex-direction: row;
    height: 60px;
    width: 100%;
    background-color: #65c7d0;
    display: flex;
    justify-content:space-between;
    align-items: center;
   
}
.modal-header p{
font-size: 30px;
font-weight: bolder;
 padding: 10px;
 color: black;
 text-shadow: 2px 2px 3px white;
}
.close-button{
   background: none;
   border: none;
   outline: none;
   padding: 10px;
}
.close-button img{
width: 50px;
}
.modal-content {
    width: 100%;
    height: calc(100% - 60px);
    display: flex;
    justify-content:center;  
    align-items: center;
    flex-direction: row;
   
}
.modal-table{
    background-color:rgb(105, 130, 163);
    color: rgb(37, 37, 37);
    width: 100%;
    height: 100%; 
    border-collapse: collapse;
    table-layout: fixed;
} 
.modal-table td{ 
    border: 1px solid #65c7d0;
    text-align: center; 
    padding: 10px;
    font-size: 18px;

}

#btnview{
 padding: 0;
}
.view{
width: 100%;
height: 100%;padding: 0;

font-size: 16px;
color: #65c7d0;
border: none;
outline: none;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <link rel="stylesheet" href="./Proekt.css" />
  <script src="./getTableParts.js" defer></script>
  <script src="./Proect.js" defer></script>
</head>

<body>
  <header>
    <div class="logo">
      <img class="logo-icon" src="./puzzle.png" alt="" />
    </div>
    <div class="head-text">
      <p>Service JSON</p>
    </div>
  </header>
  <main>
    <div class="center-box">
      <div class="description-box">
        <span>
          Сервис предназначен для преобразования JSON файла в удобную, для
          чтения таблицу. JSON может быть настолько сложным, насколько это
          необходимо, объекты и массивы могут включать другие объекты и
          массивы. </span><br />
        <span>Пожалуйста, прикрепите свой JSON файл ниже:</span>
      </div>
      <div class="textarea-box">
        <textarea id='textplaceholder'placeholder="Вставьте сюда свои данные, JSON"></textarea>
      </div>

      <div class="transformButton-box">
        <button>Трансформировать</button>
      </div>
    </div>

    <div class="table-box">
      <table class="cyber-table"></table>
    </div>
    <div class='modal-box'>
      <div class='modal' onclick = event.stopPropagation()>
        <div class='modal-header'>
          <p>ATTACHMENTS</p>
          <button class = 'close-button'>
            <img src="./krest.png" alt="">
          </button>
        </div>
        <div class='modal-content'>
          <table  class='modal-table'></table>
        </div>
      </div>
    </div>
  </main>
  <footer>
    <div class="logo-block">
      <div class="logo">
        <img class="flogo-icon" src="./puzzle.png" alt="" />
      </div>
      <div class="fhead-text">
        <p>Service JSON</p>
      </div>
    </div>
    <div class="copyright">
      <p>Copyright © 2020 BaDev All rights reserved</p>
    </div>
  </footer>
</body>
</html>


Ответы (1 шт):

Автор решения: Igor

В JSON-содержимом textarea нет элемента CyberPunk.


Когда Вы задаете вопрос о поведении кода, которое зависит от данных, следует включать эти данные в вопрос.

→ Ссылка