ragnar
ragnar

Reputation: 35

create variables from an object

I'm working on a project where I get an object in input like this one :

const obj = {
  a: 'somestring',
  b: 42,
  c: {
   d: 'foo',
   e: 'bar'
  },
  f: [1, 2]
};

and I need to create some variables to get to this output :

const a = "somestring"
const b = 42
const c.d = "foo"
const c.e = "bar"
const f[0] = 1
const f[1] = 2

I got a result with this code :

for (const [k1, v1] of Object.entries(obj)) {
  if (typeof v1 === "object") {
    if (Array.isArray(v1)) {
      for (const [k2, v2] of Object.entries(v1)) {
      console.log(`const ${k1}[${k2}] = ${v2}`);
    }
    } else {
      for (const [k2, v2] of Object.entries(v1)) {
      console.log(`const ${k1}.${k2} = ${v2}`);
    }
    }
  } else {
    console.log(`const ${k1} = ${v1}`);    
  }
}

But when I get an object more complex like this one :

const obj = {
  a: [
    { 
      b: 'lorem'
    },
    {
      c: 'ipsum'
    }
  ],
  d: {
    e: {
      f : 'foobar'
    }
  }
};

My output look like this :

const a[0] = [object Object]
const a[1] = [object Object]
const d.e = [object Object]

I can't find any relevant solutions. Is there a solution or npm package for this?

Upvotes: 0

Views: 94

Answers (3)

Dan D.
Dan D.

Reputation: 8557

You can do it with eval function in JS:

const obj = {
    a: 'somestring',
    b: 42,
    c: {
        d: 'foo',
        e: 'bar'
    },
    f: [1, 2]
};

var log = console.log;

for (let key in obj) {
    //log(key);
    eval(`var ${key} = obj.${key}`);
}

log(a);
log(b);
log(c);
log(f);

Upvotes: 1

dave
dave

Reputation: 64657

I think you want something like this:

const obj = {
  a: 'somestring',
  b: 42,
  c: {
   d: 'foo',
   e: 'bar'
  },
  f: [1, 2]
};


const parse = (obj, prefix = '', isArray=false) => {
  Object.entries(obj).forEach(([k, v]) => {
      if (typeof v === 'object') parse(v, `${k}`, Array.isArray(v))
      else {
          const value = (typeof v === 'string') ? `"${v}"` : v;
          const before = isArray ? '[' : prefix ? '.' : '';
          const after = isArray ? ']' : '';
          console.log(`const ${prefix}${before}${k}${after} = ${value}`)
      }
  });
}

parse(obj);

Upvotes: 0

Bogdan M.
Bogdan M.

Reputation: 2181

There is a feature called destructuring docs click here

This feature as the docs say will help you create new variables from a nested object.

Taking a object which is nested you can access its leaf values and assign them directly to vars like this:

const o = { 
        a: 'a', 
        b: {
            c : 'c',
            d: {
                 e: 'e'
            }
        }
    };
    
const {a ,b : { c, d: {e} }} = o;
    
alert(a);
alert(c);
alert(e);

Edit: it works with arrays as well not objects only

Upvotes: 1

Related Questions