Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

JavaScript에서 트리에 개체의 평면 배열

<시간/>

다음과 같은 객체 배열이 있다고 가정해 보겠습니다. -

const arr = [
   { id: '1', name: 'name 1', parentId: null },
   { id: '2', name: 'name 2', parentId: null },
   { id: '2_1', name: 'name 2_1', parentId: '2' },
   { id: '2_2', name: 'name 2_2', parentId: '2' },
   { id: '3', name: 'name 3', parentId: null },
   { id: '4', name: 'name 4', parentId: null },
   { id: '5', name: 'name 5', parentId: null },
   { id: '6', name: 'name 6', parentId: null },
   { id: '7', name: 'name 7', parentId: null },
   { id: '1_1', name: 'name 1_1', parentId: '1' },
   { id: '1_2', name: 'name 1_2', parentId: '1' },
   { id: '1_3', name: 'name 1_3', parentId: '1' },
   { id: '1_4', name: 'name 1_4', parentId: '1' },
   { id: '1_5', name: 'name 1_5', parentId: '1' },
   { id: '2_1_1', name: 'name 2_1_1', parentId: '2_1' },
   { id: '2_1_2', name: 'name 2_1_2', parentId: '2_1' },
   { id: '2_1_3', name: 'name 2_1_3', parentId: '2_1' },
   { id: '2_1_4', name: 'name 2_1_4', parentId: '2_1' },
   { id: '2_1_5', name: 'name 2_1_5', parentId: '2_1' },
];

우리는 그러한 객체 배열 중 하나를 취하는 JavaScript 함수를 작성해야 합니다. 그런 다음 함수는 자식을 부모 개체에 연결하는 이 배열을 기반으로 트리 데이터 구조를 구성하고 결과를 중첩 목록 형식으로 화면에 표시해야 합니다.

예시

이에 대한 코드는 -

HTML 코드 -

<html>
   <head></head>
   <body>
      <div id = "tree">
      </div>
   </body>
</html>

자바스크립트 코드 -

const arr = [
   { id: '1', name: 'name 1', parentId: null },
   { id: '2', name: 'name 2', parentId: null },
   { id: '2_1', name: 'name 2_1', parentId: '2' },
   { id: '2_2', name: 'name 2_2', parentId: '2' },
   { id: '3', name: 'name 3', parentId: null },
   { id: '4', name: 'name 4', parentId: null },
   { id: '5', name: 'name 5', parentId: null },
   { id: '6', name: 'name 6', parentId: null },
   { id: '7', name: 'name 7', parentId: null },
   { id: '1_1', name: 'name 1_1', parentId: '1' },
   { id: '1_2', name: 'name 1_2', parentId: '1' },
   { id: '1_3', name: 'name 1_3', parentId: '1' },
   { id: '1_4', name: 'name 1_4', parentId: '1' },
   { id: '1_5', name: 'name 1_5', parentId: '1' },
   { id: '2_1_1', name: 'name 2_1_1', parentId: '2_1' },
   { id: '2_1_2', name: 'name 2_1_2', parentId: '2_1' },
   { id: '2_1_3', name: 'name 2_1_3', parentId: '2_1' },
   { id: '2_1_4', name: 'name 2_1_4', parentId: '2_1' },
   { id: '2_1_5', name: 'name 2_1_5', parentId: '2_1' },
]
const tree = document.getElementById("tree")
arr.forEach(a => {
   const div = document.createElement("div")
   if (a.parentId === null) {
      div.classList.add("parent")
      div.setAttribute("id", `id${a.id}`)
      div.innerText = a.name
      tree.appendChild(div)
   }
   else {
      const parent = document.getElementById(`id${a.parentId}`)
      if (!parent.classList.contains("parent")) {
         parent.classList.add("parent")
      }
      console.log(`${a.id} `, parent)
      let childContainer = null
      if (parent.childElementCount === 0) {
         childContainer = document.createElement("div")
         childContainer.classList.add("childContainer")
         parent.appendChild(childContainer)
         childContainer.classList.add("hidden")
      }
      else {
         childContainer = document.querySelector(`#id${a.parentId}
         .childContainer`)
      }
      div.classList.add("child")
      div.setAttribute("id", `id${a.id}`)
      div.innerText = a.name
      childContainer.appendChild(div)
   }
})
const parents =
Array.from(document.getElementsByClassName("parent")).filter(p =>
p.childElementCount !== 0)
parents.forEach(p => {
   p.addEventListener("click", function(e) {
      e.preventDefault()
      const container = this.getElementsByClassName("childContainer")[0]
      container.classList.toggle("visible")
      e.stopPropagation()
   })
})

CSS 코드 -

.parent, .child {
   cursor: pointer;
}
.parent {
   margin: 10px 0;
   font-size: 1.3rem;
}
.parent::before {
   content: "\25BA";
   margin-right: 10px;
}
.childContainer {
   margin-left: 20px;
   display: none;
}
.childContainer.visible {
   display: block;
}
.child {
   font-size: 1rem;
}
.child::before {
   content: "\25BA";
}

그리고 화면의 출력은 -

JavaScript에서 트리에 개체의 평면 배열