Raheel
Raheel

Reputation: 9024

Return object with default values from an array in JavaScript

Consider:

    const fields = ['email', 'password'];

    const objFields = {};
    fields.forEach(value => {
      objFields[value] = '';
    });

    console.log(objFields);
// Outputs {email: "", password: ""}

I want to achieve the same result, but without having to initialize an empty object.

Actually, my case is that I want to set the initial state of a React component.

class App extends Component {
  fields = ['email', 'password'];

  state = {

    fields: // The one liner code here that should return the object created from fields array,

  };
  ...

The expected result would be

// state = {fields: {email: "", password: ""}}

Upvotes: 9

Views: 3786

Answers (4)

Orelsanpls
Orelsanpls

Reputation: 23515

You need to transform your array which contains keys into a real object.

To do it, you have many possibilities, but you still have to do something. There isn't any magical trick.

My favorite solution is to use a function to insert into your utility class. So it's easy to read and reusable.


Number 1: The function

function initializeKeys(keys, initialValue, object) {
  return keys.reduce((tmp, x) => {
    tmp[x] = initialValue;

    return tmp;
  }, object);
}

const objFields = initializeKeys(['email', 'password'], '', {
  otherKey: 'a',
});

console.log(objFields);


Number 2: The forEach

const fields = ['email', 'password'];

const objFields = {};

fields.forEach(value => {
  objFields[value] = '';
});

console.log(objFields);


Number 3: The reduce

const fields = ['email', 'password'];

const objFields = {
  ...fields.reduce((tmp, x) => {
    tmp[x] = '';

    return tmp;
  }, {}),
};

console.log(objFields);

Upvotes: 2

Madara's Ghost
Madara's Ghost

Reputation: 174967

Whenever you're looking for reducing an array of values to one value, you're looking for .reduce():

state = {
  fields: fields.reduce((acc, key) => ({...acc, [key]: ''}), {}),
};

Upvotes: 10

Matt Janssen
Matt Janssen

Reputation: 1663

In modern browsers, or by using polyfills, you can use Object.fromEntries() to create an object from an array, using the array's values as keys/properties, and fill the object's values with a default.

const fields = ['email', 'password'];

const result = Object.fromEntries(fields.map(value => [value, '']));

The result is {email: "", password: ""}.

Upvotes: 7

Nina Scholz
Nina Scholz

Reputation: 386620

You could map objects and assign all to a single object.

const
    fields = ['email', 'password'],
    object = Object.assign({}, ...fields.map(key => ({ [key]: '' })));

console.log(object);

Upvotes: 5

Related Questions