Reputation: 9024
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
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.
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);
const fields = ['email', 'password'];
const objFields = {};
fields.forEach(value => {
objFields[value] = '';
});
console.log(objFields);
const fields = ['email', 'password'];
const objFields = {
...fields.reduce((tmp, x) => {
tmp[x] = '';
return tmp;
}, {}),
};
console.log(objFields);
Upvotes: 2
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
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
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