sanaz
sanaz

Reputation: 176

how convert my nested object to array in javascript

I have an object with nested objects. In this object, each objects having two or more sub-objects. I want to get together all sub-objects into an array of data. How to do with JavaScript?

 const category = {
    id: 1,
    title: "a",
    level: 2,
    __parent: {
      id: 2,
      title: "b",
      level: 1,
      __parent: {
        id: 3,
        title: "c",
        level: 0,
      }
    }
  };

The output I want is this:

   [{
    id: 1,
        title: "a",
        level: 2,
    __parent: null
    },
    {
     id: 2,
          title: "b",
          level: 1,
    __parent: null
    
    },
    {
      id: 3,
            title: "c",
            level: 0,
    __parent:null
    
    }]

Upvotes: 1

Views: 96

Answers (5)

Sanket Shah
Sanket Shah

Reputation: 3091

Case 1: Using Recursion

You can make recursive function like this:

const category = {
  id: 1,
  title: "a",
  level: 2,
  __parent: {
    id: 2,
    title: "b",
    level: 1,
    __parent: {
      id: 3,
      title: "c",
      level: 0,
    }
  }
};

const result = [];

function recursiveOuput(data){
  let tempObj = {};
  Object.keys(data).map((key, index) => {
     if(typeof data[key] !== 'object'){
      tempObj[key] = data[key];
      if(!Object.keys(data).includes('__parent') && (index === Object.keys(data).length -1)){
        tempObj['__parent'] = null;
        result.push(tempObj);
      }
     }else{
      tempObj['__parent'] = null;
      result.push(tempObj);
      recursiveOuput(data[key]);
     } 
  })
  return result;
};

console.log(recursiveOuput(category));


Case 2: Using While loop

const category = {
  id: 1,
  title: "a",
  level: 2,
  __parent: {
    id: 2,
    title: "b",
    level: 1,
    __parent: {
      id: 3,
      title: "c",
      level: 0,
    }
  }
};

const result = [];

let parent = category;

while (parent) {
  result.push({
    id: parent.id,
    level: parent.level,
    title: parent.title,
    __parent: null
  })
  parent = parent.__parent
};

console.log(result);

Upvotes: 1

Alan Omar
Alan Omar

Reputation: 4227

use recursion to extract objects:

 const category = {
    id: 1,
    title: "a",
    level: 2,
    __parent: {
      id: 2,
      title: "b",
      level: 1,
      __parent: {
        id: 3,
        title: "c",
        level: 0,
      }
    }
  };
  
function extract(obj,arr=[]){
    arr.push({...obj,__parent:null})
    if(!obj.__parent){
        return arr
    }
    
    return extract(obj.__parent,arr)    
 }

 let result = extract(category)
 console.log(result)

Upvotes: 1

navnath
navnath

Reputation: 3714

Using Spread/Rest Operator

const category = {
    id: 1,
    title: "a",
    level: 2,
    __parent: {
      id: 2,
      title: "b",
      level: 1,
      __parent: {
        id: 3,
        title: "c",
        level: 0,
      }
    }
  };

const {__parent, ...firstObject} = category;

result = [
    firstObject,
    {...category['__parent'], '__parent': null },
    {...category['__parent']['__parent'], '__parent': null},
];

console.log(result);

Upvotes: 0

windmaomao
windmaomao

Reputation: 7680

You essentially want to get the list of ancestors.

const ancestors = []
var parent = category
while (parent) {
  ancestors.push({
    id: parent.id,
    level: parent.level,
    __parent: null
  })
  parent = parent.__parent
}

Upvotes: 1

Riccardo Belingheri
Riccardo Belingheri

Reputation: 11

It Be some like this :

 const myArray = []
const category = ...;

function foo(obj){
    myArray.push({ 
         title:obj.title,
          ....
    })
    if (obj._parent)
        foo(obj._parent)
}
foo(category)

Upvotes: 1

Related Questions