Динамически формируемый массив объектов с использованием заданного списка - PullRequest
1 голос
/ 11 марта 2020

Inputs1

var aa = [
   {
      "id":1,
      "name":"ajai",
      "country":"india",
      "qualification":"BE",
      "age":23
   },
   {
      "id":2,
      "name":"aravindh",
      "country":"india",
      "qualification":"BCOM",
      "age":24
   },
   {
      "id":3,
      "name":"gopal",
      "country":"china",
      "qualification":"MA",
      "age":23
   },
   {
      "id":4,
      "name":"guvaliour",
      "country":"china",
      "qualification":"BE",
      "age":24
   },
   {
      "id":5,
      "name":"anavarthan",
      "country":"japan",
      "qualification":"BE",
      "age":25
   },
   {
      "id":6,
      "name":"veer",
      "country":"china",
      "qualification":"MA",
      "age":23
   },
   {
      "id":7,
      "name":"ramani",
      "country":"india",
      "qualification":"BE",
      "age":23
   },
   {
      "id":8,
      "name":"kumar",
      "country":"india",
      "qualification":"MBA",
      "age":23
   }
]

Input2

 var bb = ['country','age','qualification']

На основе обоих входов я хочу сформировать массив объектов, используя этот требуемый формат.

Требуемый формат:

[
   {
      "id":"india",
      "children":[
         {
            "id":"23",
            "children":[
               {
                  "id":"BE",
                  "children":[

                  ],
                  "dataSet":[
                     {
                        "id":1,
                        "name":"ajai",
                        "country":"india",
                        "qualification":"BE",
                        "age":23
                     },
                     {
                        "id":7,
                        "name":"ramani",
                        "country":"india",
                        "qualification":"BE",
                        "age":23
                     }
                  ]
               },
               {
                  "id":"MBA",
                  "children":[

                  ],
                  "dataSet":[
                     {
                        "id":8,
                        "name":"kumar",
                        "country":"india",
                        "qualification":"MBA",
                        "age":23
                     }
                  ]
               }
            ]
         },
         {
            "id":"24",
            "children":[
               {
                  "id":"BCOM",
                  "children":[

                  ],
                  "dataSet":[
                     {
                        "id":2,
                        "name":"aravindh",
                        "country":"india",
                        "qualification":"BCOM",
                        "age":24
                     }
                  ]
               }
            ]
         }
      ]
   },
   {
      "id":"china",
      "children":[
         {
            "id":"23",
            "children":[
               {
                  "id":"MA",
                  "children":[

                  ],
                  "dataSet":[
                     {
                        "id":6,
                        "name":"veer",
                        "country":"china",
                        "qualification":"MA",
                        "age":23
                     },
                     {
                        "id":3,
                        "name":"gopal",
                        "country":"china",
                        "qualification":"MA",
                        "age":23
                     }
                  ]
               }
            ]
         },
         {
            "id":"24",
            "children":[
               {
                  "id":"BE",
                  "children":[

                  ],
                  "dataSet":[
                     {
                        "id":4,
                        "name":"guvaliour",
                        "country":"china",
                        "qualification":"BE",
                        "age":24
                     }
                  ]
               }
            ]
         }
      ]
   },
   {
      "id":"japan",
      "children":[
         {
            "id":"25",
            "children":[
               {
                  "id":"BE",
                  "children":[

                  ],
                  "dataSet":[
                     {
                        "id":5,
                        "name":"anavarthan",
                        "country":"japan",
                        "qualification":"BE",
                        "age":25
                     }
                  ]
               }
            ]
         }
      ]
   }
]

Я только что попытался сформировать этот требуемый формат, используя вход 1 и вход 2, но я боролся в течение дня. Пожалуйста, кто-нибудь может помочь мне решить эту проблему. Я использую это дерево для формирования таблицы группировки в Angular 6. Это что-то вроде рекурсивного.

что-то, что я пробовал вот так

    var dd=[];
    var aa = [
      {
         "id":1,
         "name":"ajai",
         "country":"india",
         "qualification":"BE",
         "age":23
      },
      {
         "id":2,
         "name":"aravindh",
         "country":"india",
         "qualification":"BCOM",
         "age":24
      },
      {
         "id":3,
         "name":"gopal",
         "country":"china",
         "qualification":"MA",
         "age":23
      },
      {
         "id":4,
         "name":"guvaliour",
         "country":"china",
         "qualification":"BE",
         "age":24
      },
      {
         "id":5,
         "name":"anavarthan",
         "country":"japan",
         "qualification":"BE",
         "age":25
      },
      {
         "id":6,
         "name":"veer",
         "country":"china",
         "qualification":"MA",
         "age":23
      },
      {
         "id":7,
         "name":"ramani",
         "country":"india",
         "qualification":"BE",
         "age":23
      },
      {
         "id":8,
         "name":"kumar",
         "country":"india",
         "qualification":"MBA",
         "age":23
      }
   ];
   var bb = ['country','age','qualification'];
   for(var i=0;i<aa.length;i++){
      for(var j=0;j<bb.length;j++){
        dd.push(this.formingArr(aa[i][bb[j]]))
      }
     }
     console.log(dd);
  }

  formingArr(value){
    let obj={
      id:value,
      children:[],
      dataSet:[]
    }
      return obj;
  }

мой результат:

[
  {
    "id": "india",
    "children": [],
    "dataSet": []
  },
  {
    "id": 23,
    "children": [],
    "dataSet": []
  },
  {
    "id": "BE",
    "children": [],
    "dataSet": []
  },
  {
    "id": "india",
    "children": [],
    "dataSet": []
  },
  {
    "id": 24,
    "children": [],
    "dataSet": []
  },
  {
    "id": "BCOM",
    "children": [],
    "dataSet": []
  },
  {
    "id": "china",
    "children": [],
    "dataSet": []
  },
  {
    "id": 23,
    "children": [],
    "dataSet": []
  },
  {
    "id": "MA",
    "children": [],
    "dataSet": []
  },
  {
    "id": "china",
    "children": [],
    "dataSet": []
  },
  {
    "id": 24,
    "children": [],
    "dataSet": []
  },
  {
    "id": "BE",
    "children": [],
    "dataSet": []
  },
  {
    "id": "japan",
    "children": [],
    "dataSet": []
  },
  {
    "id": 25,
    "children": [],
    "dataSet": []
  },
  {
    "id": "BE",
    "children": [],
    "dataSet": []
  },
  {
    "id": "china",
    "children": [],
    "dataSet": []
  },
  {
    "id": 23,
    "children": [],
    "dataSet": []
  },
  {
    "id": "MA",
    "children": [],
    "dataSet": []
  },
  {
    "id": "india",
    "children": [],
    "dataSet": []
  },
  {
    "id": 23,
    "children": [],
    "dataSet": []
  },
  {
    "id": "BE",
    "children": [],
    "dataSet": []
  },
  {
    "id": "india",
    "children": [],
    "dataSet": []
  },
  {
    "id": 23,
    "children": [],
    "dataSet": []
  },
  {
    "id": "MBA",
    "children": [],
    "dataSet": []
  }
]

1 Ответ

1 голос
/ 11 марта 2020

Вы можете использовать вложенный Map для создания древовидной структуры, а затем рекурсивно выполнять итерацию этого дерева для преобразования этих карт в простой вложенный массив объектов:

function transform(data, props) {
    // A recursive function to translate nested maps to plain objects/arrays
    const recur = (map, depth) => Array.from(map, ([id, value]) => depth ? {
        id,
        children: recur(value, depth - 1)
    } : {
        id,
        children: [],
        dataSet: Array.from(value.values())
    });

    // First create a nested Map to efficiently create the tree
    let result = new Map;
    for (let obj of data) {
        let map = result;
        for (let prop of props) {
            let key = obj[prop];
            let children = map.get(key);
            if (!children) map.set(key, children = new Map);
            map = children;
        }
        map.set(map.size, obj); // Deepest level is array-like
    }
    // Use recursion to convert the nested Map to the desired object structure
    return recur(result, props.length - 1);
}

// Demo on sample data
var aa = [{"id":1,"name":"ajai","country":"india","qualification":"BE","age":23},{"id":2,"name":"aravindh","country":"india","qualification":"BCOM","age":24},{"id":3,"name":"gopal","country":"china","qualification":"MA","age":23},{"id":4,"name":"guvaliour","country":"china","qualification":"BE","age":24},{"id":5,"name":"anavarthan","country":"japan","qualification":"BE","age":25},{"id":6,"name":"veer","country":"china","qualification":"MA","age":23},{"id":7,"name":"ramani","country":"india","qualification":"BE","age":23},{"id":8,"name":"kumar","country":"india","qualification":"MBA","age":23}];

var bb = ['country','age','qualification']

console.log(transform(aa, bb));
 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...