Return object with default values from array in Ja

2020-05-06 00:50发布

问题:

    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 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,

  };
  ...

expected result would be

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

回答1:

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]: ''}), {}),
};


回答2:

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

To do it you have many possibilites, but you still have to do something, there is no magical trick.

My favorite soluce is to use a function to insert into your Utilitary class. So it's easy to read and re-usable.


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);



回答3:

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);