1

I have a JS object from which I will extract an array of keys (using Object.keys()) and then I want to use those same keys to create a different object, but this time with its values initialized to null.

In Python, I would do something like:

list_of_keys = ["key_1", "key_2"]

# The * unpacks the list, could be thought as a JS spread operator
new_dict = dict.fromkeys(*list_of_keys)

And I would retrieve a new dictionary with all its values initialized to None as a default.

I don't seem to find a similar property or method in Javascript, however.

EDIT: If using ESLint, @CerebralFart answer (the for... of...) might trigger a complaint from the linter. It can be addressed here.

LeperAffinity666
  • 364
  • 4
  • 14

2 Answers2

1

You can use reduce method to do it:

const object = { key_1: 'value_1', key_2: 'value_2', key_3: 'value_3' };

const new_object = Object.keys(object).reduce((accumulator, currentValue)=> {
  accumulator[currentValue] = null;
  return accumulator;
}, {});

console.log(new_object)
NeNaD
  • 18,172
  • 8
  • 47
  • 89
  • That's some magnificent [abuse of the reduce function](https://www.youtube.com/watch?v=qaGjS7-qWzg). A simple `for-in` loop would be much more appropriate – CerebralFart Mar 03 '22 at 21:53
  • 1
    This answer also works, but (_at least for me_) it's difficult to understand at first sight. I guess I'll stick to the for loop. But this code is quite ingenious, nice trick – LeperAffinity666 Mar 03 '22 at 22:06
1

There's no need to make this more complicated than a simple for loop:

const object = { key_1: 'value_1', key_2: 'value_2', key_3: 'value_3' };
const newObject = {};

for (const key in object) {
  newObject[key] = null
}

console.log(newObject);

Or, if you only have the keys

const keys = ['key_1', 'key_2', 'key_3'];
const newObject = {};

for (const key of keys) {
  newObject[key] = null
}

console.log(newObject);

ETA: You could also use Object.fromEntries with some mapping. Depending on what you want to do with the object, this may be marginally faster.

const object = { key_1: 'value_1', key_2: 'value_2', key_3: 'value_3' };

const newObject = Object.fromEntries(Object.keys(object).map(key => [key, null]));

console.log(newObject);
CerebralFart
  • 3,336
  • 5
  • 26
  • 29
  • 1
    I ended up doing exactly that, even although I really think that the `reduce` approach is quite ingenious. But I tend to favor readability and performance, so I think I'll stick to the ole for loop. Edited a word, confused ingenious with ingenuous – LeperAffinity666 Mar 03 '22 at 22:03