Как реализовтаь цикл или рекурсивнуый метод в JS так, чтобы из значений HTML элементов вышла такая структура JSON как в примере?

Пример JSON'a:

"squadName": "Super hero squad",
   "homeTown": "Metro City",
   "formed": 2016,
   "secretBase": "Super tower",
   "active": true,
   "members": [
       {
           "name": "Molecule Man",
           "age": 29,
           "secretIdentity": "Dan Jukes",
           "powers": [
               "Radiation resistance",
               "Turning tiny",
               "Radiation blast"
           ]
       },
       {
           "name": "Madame Uppercut",
           "age": 39,
           "secretIdentity": "Jane Wilson",
           "powers": [
               "Million tonne punch",
               "Damage resistance",
               "Superhuman reflexes"
           ]
       },
       {
           "name": "Eternal Flame",
           "age": 1000000,
           "secretIdentity": "Unknown",
           "powers": [
               "Immortality",
               "Heat Immunity",
               "Inferno",
               "Teleportation",
               "Interdimensional travel"
           ]
       }
   ]
}

HTML из которого нужно взять данные:

<div class="first">
    <div class="second">
        <div class="strela"></div><span class="name ">json</span><span class="value"></span>
        <div class="btns"><button class="clone">+</button><button class="remove">-</button></div><span
            class="type">object</span>
        <div class="child">
            <div class="first closed strg">
                <div class="second">
                    <div class="strela hide"></div><span class="name ">squadName</span><span class="value editable"
                        contenteditable="true">Super hero squad</span>
                    <div class="btns"></div><span class="type">string</span>
                    <div class="child" style=""></div>
                </div>
            </div>
            <div class="first closed strg">
                <div class="second">
                    <div class="strela hide"></div><span class="name ">homeTown</span><span class="value editable"
                        contenteditable="true">Metro City</span>
                    <div class="btns"></div><span class="type">string</span>
                    <div class="child" style=""></div>
                </div>
            </div>
            <div class="first closed nmbr">
                <div class="second">
                    <div class="strela hide"></div><span class="name ">formed</span><span class="value editable"
                        contenteditable="true">2016</span>
                    <div class="btns"></div><span class="type">number</span>
                    <div class="child" style=""></div>
                </div>
            </div>
            <div class="first closed strg">
                <div class="second">
                    <div class="strela hide"></div><span class="name ">secretBase</span><span class="value editable"
                        contenteditable="true">Super tower</span>
                    <div class="btns"></div><span class="type">string</span>
                    <div class="child" style=""></div>
                </div>
            </div>
            <div class="first closed bool">
                <div class="second">
                    <div class="strela hide"></div><span class="name ">active</span><span class="value"><input
                            class="check" type="checkbox"></span>
                    <div class="btns"></div><span class="type">boolean</span>
                    <div class="child" style=""></div>
                </div>
            </div>
            <div class="first closed array">
                <div class="second">
                    <div class="strela"></div><span class="name ">members</span><span class="value"></span>
                    <div class="btns"></div><span class="type">array</span>
                    <div class="child" style="">
                        <div class="first closed obj">
                            <div class="second">
                                <div class="strela"></div><span class="name ">0</span><span class="value"></span>
                                <div class="btns"><button class="clone">+</button><button class="remove">-</button>
                                </div>
                                <span class="type">object</span>
                                <div class="child" style="">
                                    <div class="first closed strg">
                                        <div class="second">
                                            <div class="strela hide"></div><span class="name ">name</span><span
                                                class="value editable" contenteditable="true">Molecule Man</span>
                                            <div class="btns"></div><span class="type">string</span>
                                            <div class="child" style=""></div>
                                        </div>
                                    </div>
                                    <div class="first closed nmbr">
                                        <div class="second">
                                            <div class="strela hide"></div><span class="name ">age</span><span
                                                class="value editable" contenteditable="true">29</span>
                                            <div class="btns"></div><span class="type">number</span>
                                            <div class="child" style=""></div>
                                        </div>
                                    </div>
                                    <div class="first closed strg">
                                        <div class="second">
                                            <div class="strela hide"></div><span
                                                class="name ">secretIdentity</span><span class="value editable"
                                                contenteditable="true">Dan
                                                Jukes</span>
                                            <div class="btns"></div><span class="type">string</span>
                                            <div class="child" style=""></div>
                                        </div>
                                    </div>
                                    <div class="first closed array">
                                        <div class="second">
                                            <div class="strela"></div><span class="name ">powers</span><span
                                                class="value"></span>
                                            <div class="btns"></div><span class="type">array</span>
                                            <div class="child" style="">
                                                <div class="first closed strg">
                                                    <div class="second">
                                                        <div class="strela hide"></div><span class="name ">0</span><span
                                                            class="value editable" contenteditable="true">Radiation
                                                            resistance</span>
                                                        <div class="btns"></div><span class="type">string</span>
                                                        <div class="child" style=""></div>
                                                    </div>
                                                </div>
                                                <div class="first closed strg">
                                                    <div class="second">
                                                        <div class="strela hide"></div><span class="name ">1</span><span
                                                            class="value editable" contenteditable="true">Turning
                                                            tiny</span>
                                                        <div class="btns"></div><span class="type">string</span>
                                                        <div class="child" style=""></div>
                                                    </div>
                                                </div>
                                                <div class="first closed strg">
                                                    <div class="second">
                                                        <div class="strela hide"></div><span class="name ">2</span><span
                                                            class="value editable" contenteditable="true">Radiation
                                                            blast</span>
                                                        <div class="btns"></div><span class="type">string</span>
                                                        <div class="child" style=""></div>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="first closed obj">
                            <div class="second">
                                <div class="strela"></div><span class="name ">1</span><span class="value"></span>
                                <div class="btns"><button class="clone">+</button><button class="remove">-</button>
                                </div>
                                <span class="type">object</span>
                                <div class="child" style="">
                                    <div class="first closed strg">
                                        <div class="second">
                                            <div class="strela hide"></div><span class="name ">name</span><span
                                                class="value editable" contenteditable="true">Madame
                                                Uppercut</span>
                                            <div class="btns"></div><span class="type">string</span>
                                            <div class="child" style=""></div>
                                        </div>
                                    </div>
                                    <div class="first closed nmbr">
                                        <div class="second">
                                            <div class="strela hide"></div><span class="name ">age</span><span
                                                class="value editable" contenteditable="true">39</span>
                                            <div class="btns"></div><span class="type">number</span>
                                            <div class="child" style=""></div>
                                        </div>
                                    </div>
                                    <div class="first closed strg">
                                        <div class="second">
                                            <div class="strela hide"></div><span
                                                class="name ">secretIdentity</span><span class="value editable"
                                                contenteditable="true">Jane
                                                Wilson</span>
                                            <div class="btns"></div><span class="type">string</span>
                                            <div class="child" style=""></div>
                                        </div>
                                    </div>
                                    <div class="first closed array">
                                        <div class="second">
                                            <div class="strela"></div><span class="name ">powers</span><span
                                                class="value"></span>
                                            <div class="btns"></div><span class="type">array</span>
                                            <div class="child" style="">
                                                <div class="first closed strg">
                                                    <div class="second">
                                                        <div class="strela hide"></div><span class="name ">0</span><span
                                                            class="value editable" contenteditable="true">Million tonne
                                                            punch</span>
                                                        <div class="btns"></div><span class="type">string</span>
                                                        <div class="child" style=""></div>
                                                    </div>
                                                </div>
                                                <div class="first closed strg">
                                                    <div class="second">
                                                        <div class="strela hide"></div><span class="name ">1</span><span
                                                            class="value editable" contenteditable="true">Damage
                                                            resistance</span>
                                                        <div class="btns"></div><span class="type">string</span>
                                                        <div class="child" style=""></div>
                                                    </div>
                                                </div>
                                                <div class="first closed strg">
                                                    <div class="second">
                                                        <div class="strela hide"></div><span class="name ">2</span><span
                                                            class="value editable" contenteditable="true">Superhuman
                                                            reflexes</span>
                                                        <div class="btns"></div><span class="type">string</span>
                                                        <div class="child" style=""></div>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="first closed obj">
                            <div class="second">
                                <div class="strela"></div><span class="name ">2</span><span class="value"></span>
                                <div class="btns"><button class="clone">+</button><button class="remove">-</button>
                                </div>
                                <span class="type">object</span>
                                <div class="child" style="">
                                    <div class="first closed strg">
                                        <div class="second">
                                            <div class="strela hide"></div><span class="name ">name</span><span
                                                class="value editable" contenteditable="true">Eternal
                                                Flame</span>
                                            <div class="btns"></div><span class="type">string</span>
                                            <div class="child" style=""></div>
                                        </div>
                                    </div>
                                    <div class="first closed nmbr">
                                        <div class="second">
                                            <div class="strela hide"></div><span class="name ">age</span><span
                                                class="value editable" contenteditable="true">1000000</span>
                                            <div class="btns"></div><span class="type">number</span>
                                            <div class="child" style=""></div>
                                        </div>
                                    </div>
                                    <div class="first closed strg">
                                        <div class="second">
                                            <div class="strela hide"></div><span
                                                class="name ">secretIdentity</span><span class="value editable"
                                                contenteditable="true">Unknown</span>
                                            <div class="btns"></div><span class="type">string</span>
                                            <div class="child" style=""></div>
                                        </div>
                                    </div>
                                    <div class="first closed array">
                                        <div class="second">
                                            <div class="strela"></div><span class="name ">powers</span><span
                                                class="value"></span>
                                            <div class="btns"></div><span class="type">array</span>
                                            <div class="child" style="">
                                                <div class="first closed strg">
                                                    <div class="second">
                                                        <div class="strela hide"></div><span class="name ">0</span><span
                                                            class="value editable"
                                                            contenteditable="true">Immortality</span>
                                                        <div class="btns"></div><span class="type">string</span>
                                                        <div class="child" style=""></div>
                                                    </div>
                                                </div>
                                                <div class="first closed strg">
                                                    <div class="second">
                                                        <div class="strela hide"></div><span class="name ">1</span><span
                                                            class="value editable" contenteditable="true">Heat
                                                            Immunity</span>
                                                        <div class="btns"></div><span class="type">string</span>
                                                        <div class="child" style=""></div>
                                                    </div>
                                                </div>
                                                <div class="first closed strg">
                                                    <div class="second">
                                                        <div class="strela hide"></div><span class="name ">2</span><span
                                                            class="value editable" contenteditable="true">Inferno</span>
                                                        <div class="btns"></div><span class="type">string</span>
                                                        <div class="child" style=""></div>
                                                    </div>
                                                </div>
                                                <div class="first closed strg">
                                                    <div class="second">
                                                        <div class="strela hide"></div><span class="name ">3</span><span
                                                            class="value editable"
                                                            contenteditable="true">Teleportation</span>
                                                        <div class="btns"></div><span class="type">string</span>
                                                        <div class="child" style=""></div>
                                                    </div>
                                                </div>
                                                <div class="first closed strg">
                                                    <div class="second">
                                                        <div class="strela hide"></div><span class="name ">4</span><span
                                                            class="value editable"
                                                            contenteditable="true">Interdimensional
                                                            travel</span>
                                                        <div class="btns"></div><span class="type">string</span>
                                                        <div class="child" style=""></div>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

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

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

Что-то такое?

const domElement = document.querySelector('.first > .second > .child').children;

let array = extractJson(domElement);
let json = JSON.stringify(array);
console.log(json);

function extractJson(dom) {
  let json = {};
  for (let element of dom) {
    let key = element.querySelector('.name').textContent.replace(/\s\s+/g, ' ');
    let val = element.querySelector('.value').textContent.replace(/\s\s+/g, ' ');
    let classList = element.classList;

    if (classList.contains('strg')) {
      json[key] = val;
    } else if (classList.contains('nmbr')) {
      json[key] = parseInt(val);
    } else if (classList.contains('bool')) {
      let check = element.querySelector('.check');
      json[key] = check.checked;
    } else if (classList.contains('array')) {
      let array = element.querySelector('.child').children;
      json[key] = [extractJson(array)];
    } else if (classList.contains('obj')) {
      let array = element.querySelector('.child').children;
      json[key] = extractJson(array);
    }
  }
  return json;
}
<div class="first">
  <div class="second">
    <div class="strela"></div><span class="name ">json</span><span class="value"></span>
    <div class="btns"><button class="clone">+</button><button class="remove">-</button></div><span class="type">object</span>
    <div class="child">
      <div class="first closed strg">
        <div class="second">
          <div class="strela hide"></div><span class="name ">squadName</span><span class="value editable" contenteditable="true">Super hero squad</span>
          <div class="btns"></div><span class="type">string</span>
          <div class="child" style=""></div>
        </div>
      </div>
      <div class="first closed strg">
        <div class="second">
          <div class="strela hide"></div><span class="name ">homeTown</span><span class="value editable" contenteditable="true">Metro City</span>
          <div class="btns"></div><span class="type">string</span>
          <div class="child" style=""></div>
        </div>
      </div>
      <div class="first closed nmbr">
        <div class="second">
          <div class="strela hide"></div><span class="name ">formed</span><span class="value editable" contenteditable="true">2016</span>
          <div class="btns"></div><span class="type">number</span>
          <div class="child" style=""></div>
        </div>
      </div>
      <div class="first closed strg">
        <div class="second">
          <div class="strela hide"></div><span class="name ">secretBase</span><span class="value editable" contenteditable="true">Super tower</span>
          <div class="btns"></div><span class="type">string</span>
          <div class="child" style=""></div>
        </div>
      </div>
      <div class="first closed bool">
        <div class="second">
          <div class="strela hide"></div><span class="name ">active</span><span class="value"><input
                            class="check" type="checkbox"></span>
          <div class="btns"></div><span class="type">boolean</span>
          <div class="child" style=""></div>
        </div>
      </div>
      <div class="first closed array">
        <div class="second">
          <div class="strela"></div><span class="name ">members</span><span class="value"></span>
          <div class="btns"></div><span class="type">array</span>
          <div class="child" style="">
            <div class="first closed obj">
              <div class="second">
                <div class="strela"></div><span class="name ">0</span><span class="value"></span>
                <div class="btns"><button class="clone">+</button><button class="remove">-</button>
                </div>
                <span class="type">object</span>
                <div class="child" style="">
                  <div class="first closed strg">
                    <div class="second">
                      <div class="strela hide"></div><span class="name ">name</span><span class="value editable" contenteditable="true">Molecule Man</span>
                      <div class="btns"></div><span class="type">string</span>
                      <div class="child" style=""></div>
                    </div>
                  </div>
                  <div class="first closed nmbr">
                    <div class="second">
                      <div class="strela hide"></div><span class="name ">age</span><span class="value editable" contenteditable="true">29</span>
                      <div class="btns"></div><span class="type">number</span>
                      <div class="child" style=""></div>
                    </div>
                  </div>
                  <div class="first closed strg">
                    <div class="second">
                      <div class="strela hide"></div><span class="name ">secretIdentity</span><span class="value editable" contenteditable="true">Dan
                                                Jukes</span>
                      <div class="btns"></div><span class="type">string</span>
                      <div class="child" style=""></div>
                    </div>
                  </div>
                  <div class="first closed array">
                    <div class="second">
                      <div class="strela"></div><span class="name ">powers</span><span class="value"></span>
                      <div class="btns"></div><span class="type">array</span>
                      <div class="child" style="">
                        <div class="first closed strg">
                          <div class="second">
                            <div class="strela hide"></div><span class="name ">0</span><span class="value editable" contenteditable="true">Radiation
                                                            resistance</span>
                            <div class="btns"></div><span class="type">string</span>
                            <div class="child" style=""></div>
                          </div>
                        </div>
                        <div class="first closed strg">
                          <div class="second">
                            <div class="strela hide"></div><span class="name ">1</span><span class="value editable" contenteditable="true">Turning
                                                            tiny</span>
                            <div class="btns"></div><span class="type">string</span>
                            <div class="child" style=""></div>
                          </div>
                        </div>
                        <div class="first closed strg">
                          <div class="second">
                            <div class="strela hide"></div><span class="name ">2</span><span class="value editable" contenteditable="true">Radiation
                                                            blast</span>
                            <div class="btns"></div><span class="type">string</span>
                            <div class="child" style=""></div>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div class="first closed obj">
              <div class="second">
                <div class="strela"></div><span class="name ">1</span><span class="value"></span>
                <div class="btns"><button class="clone">+</button><button class="remove">-</button>
                </div>
                <span class="type">object</span>
                <div class="child" style="">
                  <div class="first closed strg">
                    <div class="second">
                      <div class="strela hide"></div><span class="name ">name</span><span class="value editable" contenteditable="true">Madame
                                                Uppercut</span>
                      <div class="btns"></div><span class="type">string</span>
                      <div class="child" style=""></div>
                    </div>
                  </div>
                  <div class="first closed nmbr">
                    <div class="second">
                      <div class="strela hide"></div><span class="name ">age</span><span class="value editable" contenteditable="true">39</span>
                      <div class="btns"></div><span class="type">number</span>
                      <div class="child" style=""></div>
                    </div>
                  </div>
                  <div class="first closed strg">
                    <div class="second">
                      <div class="strela hide"></div><span class="name ">secretIdentity</span><span class="value editable" contenteditable="true">Jane
                                                Wilson</span>
                      <div class="btns"></div><span class="type">string</span>
                      <div class="child" style=""></div>
                    </div>
                  </div>
                  <div class="first closed array">
                    <div class="second">
                      <div class="strela"></div><span class="name ">powers</span><span class="value"></span>
                      <div class="btns"></div><span class="type">array</span>
                      <div class="child" style="">
                        <div class="first closed strg">
                          <div class="second">
                            <div class="strela hide"></div><span class="name ">0</span><span class="value editable" contenteditable="true">Million tonne
                                                            punch</span>
                            <div class="btns"></div><span class="type">string</span>
                            <div class="child" style=""></div>
                          </div>
                        </div>
                        <div class="first closed strg">
                          <div class="second">
                            <div class="strela hide"></div><span class="name ">1</span><span class="value editable" contenteditable="true">Damage
                                                            resistance</span>
                            <div class="btns"></div><span class="type">string</span>
                            <div class="child" style=""></div>
                          </div>
                        </div>
                        <div class="first closed strg">
                          <div class="second">
                            <div class="strela hide"></div><span class="name ">2</span><span class="value editable" contenteditable="true">Superhuman
                                                            reflexes</span>
                            <div class="btns"></div><span class="type">string</span>
                            <div class="child" style=""></div>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div class="first closed obj">
              <div class="second">
                <div class="strela"></div><span class="name ">2</span><span class="value"></span>
                <div class="btns"><button class="clone">+</button><button class="remove">-</button>
                </div>
                <span class="type">object</span>
                <div class="child" style="">
                  <div class="first closed strg">
                    <div class="second">
                      <div class="strela hide"></div><span class="name ">name</span><span class="value editable" contenteditable="true">Eternal
                                                Flame</span>
                      <div class="btns"></div><span class="type">string</span>
                      <div class="child" style=""></div>
                    </div>
                  </div>
                  <div class="first closed nmbr">
                    <div class="second">
                      <div class="strela hide"></div><span class="name ">age</span><span class="value editable" contenteditable="true">1000000</span>
                      <div class="btns"></div><span class="type">number</span>
                      <div class="child" style=""></div>
                    </div>
                  </div>
                  <div class="first closed strg">
                    <div class="second">
                      <div class="strela hide"></div><span class="name ">secretIdentity</span><span class="value editable" contenteditable="true">Unknown</span>
                      <div class="btns"></div><span class="type">string</span>
                      <div class="child" style=""></div>
                    </div>
                  </div>
                  <div class="first closed array">
                    <div class="second">
                      <div class="strela"></div><span class="name ">powers</span><span class="value"></span>
                      <div class="btns"></div><span class="type">array</span>
                      <div class="child" style="">
                        <div class="first closed strg">
                          <div class="second">
                            <div class="strela hide"></div><span class="name ">0</span><span class="value editable" contenteditable="true">Immortality</span>
                            <div class="btns"></div><span class="type">string</span>
                            <div class="child" style=""></div>
                          </div>
                        </div>
                        <div class="first closed strg">
                          <div class="second">
                            <div class="strela hide"></div><span class="name ">1</span><span class="value editable" contenteditable="true">Heat
                                                            Immunity</span>
                            <div class="btns"></div><span class="type">string</span>
                            <div class="child" style=""></div>
                          </div>
                        </div>
                        <div class="first closed strg">
                          <div class="second">
                            <div class="strela hide"></div><span class="name ">2</span><span class="value editable" contenteditable="true">Inferno</span>
                            <div class="btns"></div><span class="type">string</span>
                            <div class="child" style=""></div>
                          </div>
                        </div>
                        <div class="first closed strg">
                          <div class="second">
                            <div class="strela hide"></div><span class="name ">3</span><span class="value editable" contenteditable="true">Teleportation</span>
                            <div class="btns"></div><span class="type">string</span>
                            <div class="child" style=""></div>
                          </div>
                        </div>
                        <div class="first closed strg">
                          <div class="second">
                            <div class="strela hide"></div><span class="name ">4</span><span class="value editable" contenteditable="true">Interdimensional
                                                            travel</span>
                            <div class="btns"></div><span class="type">string</span>
                            <div class="child" style=""></div>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

→ Ссылка