JSFiddle - React, Tailwind, and code Playground

HTML

<div id="listSummary"></div>

CSS

.lv1 {
    
}

.lv2{
    padding-left: 30px;    
}

.lv3{
    padding-left: 30px;    
}

JavaScript

var data = [
  {
    cid: "211211",
    parentCid: "212121",
    level: 3,
    number: "2.1.1",
    subject: "Title 2.1.1"
  },
  {
    cid: "212121",
    parentCid: "222222",
    lv: 2,
    number: "2.1",
    subject: "Title2.1"
  },    
  {
    cid: "111111",
    parentCid: "",
    lv: 1,
    number: "1",
    subject: "Title1"
  },
  {
    cid: "222222",
    parentCid: "",
    lv: 1,
    number: "2",
    subject: "Title2"
  },
  {
    cid: "333333",
    parentCid: "",
    lv: 1,
    number: "3",
    subject: "Title3"
  }
];
	var chapterListDiv = document.getElementById("listSummary");
	var store = document.createDocumentFragment(); //we use this to store temporary orphaned childs
	for(var i=0; i<data.length; i++){
		var node = document.createElement("div");
		node.className = "lv" + (data[i].level || data[i].lv);
        var content = document.createTextNode(data[i].number + "." + " " + data[i].subject);
        node.appendChild(content);		
		node.setAttribute("data-id", data[i].cid); //set a data-id attribute. We need it for the orphaned values.
		node.setAttribute("data-parent-id", data[i].parentCid); //set a data-parent-id attribute. We need it for the orphaned values.
		if (data[i].parentCid == "") //we have a root node
		{
			chapterListDiv.appendChild(node);
		}
		else
		{
			var parent = chapterListDiv.querySelector('div[data-id="'+data[i].parentCid+'"]'); //look for a node with the parent id.
			if (parent) //parent is found
			{
				parent.appendChild(node);
			}
			else
			{
				store.appendChild(node); //temp store the node.
			}
		}
	}
    //final check
    var storeChilds = store.querySelectorAll('div[data-parent-id]');
    if (storeChilds)
    {
        Array.prototype.map.call(storeChilds, function(element){
            var parent = document.querySelector('div[data-id="'+element.getAttribute("data-parent-id")+'"]') ||
                store.querySelector('div[data-id="'+element.getAttribute("data-parent-id")+'"]')
           ...