bugfix> javascript > 投稿

次のようなテーブルからJSONデータを取得しています(非常に単純化されています):

私が取得しているJSON形式は次のとおりです:

const myObjOriginal = {
  "rows": [{
    "name": "row 1",
    "cells": [{
      "name": "level 1",
      "id": 1
    }, {
      "name": "first level 2",
      "id": 2
    }, {
      "name": "endpoint 1",
      "id": 4
    }]
  }, {
    "name": "row 2",
    "cells": [{
      "name": "level 1",
      "id": 1
    }, {
      "name": "first level 2",
      "id": 2
    }, {
      "name": "endpoint 2",
      "id": 5
    }]
  }, {
    "name": "row 3",
    "cells": [{
      "name": "level 1",
      "id": 1
    }, {
      "name": "second level 2",
      "id": 3
    }, {
      "name": "endpoint 3",
      "id": 6
    }]
  }]
};

これで必要なことは、テーブルではなくツリーに変換することです。出力は次のようになります。

const goalObject = [{
  "name": "level 1",
  "id": 2,
  "children": [{
    "name": "first level 2",
    "id": 2,
    "children": [{
      "name": "endpoint 1",
      "id": 4
    }, {
      "name": "endpoint 2",
      "id": 5
    }]
  }, {
    "name": "second level 2",
    "id": 3,
    "children": [{
      "name": "endpoint 3",
      "id": 6
    }]
  }]
}];

私は、map、reduce、filter、for loop、forEachの両方のすべての種類を試しましたが、役に立ちませんでした。

私は何らかの形で再帰関数を作成する必要があることを認識していますが、それを機能させることもできていません。

ここに私が試した一つの例がありますが、それは完全に間違っていることがわかります...

function getChildrenOfCurrentItem(rowIndex = 0, cellIndex = 0) {
  let current = {};
  let myObj = {};
  for(let i = 0; i < myCopy.rows.length; i++){
    next = myCopy.rows[i].cells[cellIndex];
    const cells = myCopy.rows[i].cells;
    const isSame = compareObjects(current, next);
    if(!isSame){
      current = next;
      myObj.item = current;
      //cellIndex++;
      for(let j = 0; j < cells.length; j++){
        let cell = cells[j];
        console.log('cell', cell);
      }
    }
    console.log('myObj', myObj);
    //cellIndex++;
    if(cellIndex < max) {
        getChildrenOfCurrentItem(rowIndex, cellIndex);
    }
    rowIndex++;
  }
  return myObj;
}

回答 1 件
  • 同じ id を持つグループを探すことにより、反復アプローチを使用できます。 。

    var data = { rows: [{ name: "row 1", cells: [{ name: "level 1", id: 1 }, { name: "first level 2", id: 2 }, { name: "endpoint 1", id: 4 }] }, { name: "row 2", cells: [{ name: "level 1", id: 1 }, { name: "first level 2", id: 2 }, { name: "endpoint 2", id: 5 }] }, { name: "row 3", cells: [{ name: "level 1", id: 1 }, { name: "second level 2", id: 3 }, { name: "endpoint 3", id: 6 }] }] },
        result = [];
    data.rows.forEach(({ cells }) => {
        cells.reduce((level, { name, id }) => {
            var temp = (level.children = level.children || []).find(o => o.id === id);
            if (!temp) {
                temp = { name, id };
                level.children.push(temp);
            }
            return temp;
        }, { children: result });
    });
    console.log(result);
    
    
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    
    

あなたの答え