2

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});
Mike
  • 23
  • 2
  • What is the expected output? `values[x]` is similar to values[0], `values` is an object. This will fail if `values` object dont have key `0` – kiranvj Jan 17 '22 at 06:29
  • It would be better if you could publish the original object and the expected result – A1exandr Belan Jan 17 '22 at 06:33

3 Answers3

1

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 };
}
skara9
  • 4,042
  • 1
  • 6
  • 21
0

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 });
Nitheesh
  • 19,238
  • 3
  • 22
  • 49
0

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]];
    }
}
Wai Ha Lee
  • 8,598
  • 83
  • 57
  • 92