Mike
Mike

Reputation: 23

Nested Object Loop in JS

I'm trying to add a series of values to a nested object, having some trouble with the loop in the following code. Any help would be really appreciated.

let settings = {};

function write(id, values) {
    if(!settings[id]) settings[id] = {};
    for(var x = 0; x < Object.keys(values).length; x ++) {
        settings[id][values[x]] = values[values[x]];
    }
}

//example
write('example', {'prop1': 5, 'prop2': 10});

Upvotes: 2

Views: 80

Answers (3)

Ilham Naufal
Ilham Naufal

Reputation: 61

try to keep the Object.keys(values) return in another variable and use it to assign value in setting like this

function write(id, values) {
    if(!settings[id]) settings[id] = {};
    const key = Object.keys(values) 
    for(var x = 0; x < key.length; x ++) {
        settings[id][key[x]] = values[key[x]];
    }
}

Upvotes: 0

Nitheesh
Nitheesh

Reputation: 19986

values is an object. Accessing values[x] will return undefined.

You have to access it with the correct keys in that object as below.

let settings = {};

function write(id, values) {
  if (!settings[id]) settings[id] = {};
  const keys = Object.keys(values);
  for (var x = 0; x < keys.length; x++) {
    settings[id][keys[x]] = values[keys[x]];
  }
  console.log(settings)
}

//example
write('example', { 'prop1': 5, 'prop2': 10 });

Upvotes: 0

skara9
skara9

Reputation: 4194

You're attempting to index the object values with x, which is a number. To loop through the keys of your object you can use a for...in loop:

function write(id, values) {
    if(!settings[id]) settings[id] = {};
    for(const key in values) {
        settings[id][key] = values[key];
    }
}

Another approach would be to use object destructuring:

function write(id, values) {
    settings[id] = { ...(settings[id] || {}), ...values };
}

Upvotes: 1

Related Questions