E-At
@E-At (E Atwell)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ど~~してもValue値が取得できない(配列中の複数オブジェクト、そのオブジェクト中の配列中の複数オブジェクト)

やりたいこと

配列データから取得して
1.会社ごとのボックスをループ生成(ここまでは自力でできた)
2.その生成されたボックスの中で、更に複数のリストをループ生成
3.最終的には下記「実際のテストコード」html でコメントアウトしてあるソースコードのように生成

ボックス1の中身
会社A:
 リスト1 文書名A1・・・
 リスト2 文書名A2・・・
ボックス2の中身
会社B:
 リスト1 文書名B1・・・
 リスト2 文書名B2・・・

実際のテストコード:https://codepen.io/e-at/pen/poVXaXP

どうしても解決できない問題

forEach ループで生成された box の中で更に ul の中にリストをループ生成することができず、またリストのelement 自体は何とか生成できてもループされておらず、しかも値がundefined になってしまいます。

配列やオブジェクトが入り混じっているデータ自体の作成方法が悪いのかもしれません。その判別も今いちよくわかっていません。

約1週間ほど毎日少しずつ、いろいろトライしてますが初心者の私にはどうしても解決できません。
どうか、知恵をお貸しください!どうぞ、よろしくお願いします。

該当するソースコード

const datas = [
  {
    tagName: 'A',
    companyName: 'A corporation',
    documents: [
      {
        documentName: 'document A-1',
        version: 'Ver.A 1.0',
        issued: '2022/01',
      },
      {
        documentName: 'document A-2',
        version: 'Ver.A 2.0',
        issued: '2022/02',
      },
    ],
  },
  {
    tagName: 'B',
    companyName: 'B corporation',
    documents: [
      {
        documentName: 'document B-1',
        version: 'Ver.B 1.0',
        issued: '2022/03',
      },
      {
        documentName: 'document B-2',
        version: 'Ver.B 2.0',
        issued: '2022/04',
      },
    ],
  },
];

const boxes = document.querySelector('#boxes');

const createBox = data => {
  const box = document.createElement('div');
  box.classList.add('box');
  box.innerHTML = `
  <p>${data.tagName}</p>
  <h3>${data.companyName}</h3>
  <ul class="documents">${createDocList(data.documents)}</ul>
  `;
  boxes.appendChild(box);
};

const createDocList = doc => {
  const li = document.createElement('li');
  return (li.innerHTML = `
  <li>${doc.documentName}</li>
  `);
};

datas.forEach(data => {
  createBox(data);
});

0

1Answer

下記ではいかがでしょうか。



const createBox = data => {
  const box = document.createElement('div');
  box.classList.add('box');
  box.innerHTML = `
    <p>${data.tagName}</p>
    <h3>${data.companyName}</h3>
    <ul class="documents">${createDocList(data.documents).join('')}</ul>
  `;
  boxes.appendChild(box);
};

const createDocList = doc => doc.map(docitem => `<li>${docitem.documentName}</li>`);

以下略
1Like

Comments

  1. @E-At

    Questioner

    出来ました!!!
    map と join なんですね。もっとarray method を勉強します。
    本当に助かりました!ありがとうございました🙇‍♀️
  2. フィートバックありがとうございます。
    map を使いこなせるようになると、Javascript プログラミングの幅がぐんと広がると思います。
    何かあればまたお気軽にどうぞ😀

Your answer might help someone💌