Лучший способ создать экземпляр объекта с каждым ключом, равным нулю?

Итак, в моем проекте React у меня есть резервное состояние по умолчанию для адресной формы, которое выглядит так:

state = {
  newLocation: this.props.location || {
    lat: null,
    lng: null,
    street: null,
    complement: null,
    neighbourhood: null,
    city: null,
    state: null,
    zipCode: null,
    country: null,
  },
}

Однако определение такого большого объекта со всеми ключами, равными нулю, кажется довольно нелепым. Есть ли более короткий способ сделать это? Что-то в ES6/ES7?


person j_d    schedule 11.01.2017    source источник
comment
Им обязательно нужно явно установить значение null? Не может ли любой код, который использует эти свойства, просто принять undefined как пустое значение, чтобы вы могли просто иметь: newLocation: this.props.location || {}.   -  person CodingIntrigue    schedule 11.01.2017


Ответы (2)


Вы можете использовать массив и повторять ключи и создавать новый объект с Object.assign.

var keys = ['lat', 'lng', 'street', 'complement', 'neighbourhood', 'city', 'state', 'zipCode', 'country'],
    loc = { lat: 123, lng: 246, city: 'NY', country: 'USA' },
    state = {
        newLocation: Object.assign(keys.reduce((o, k) => Object.assign(o, { [k]: null }), {}), loc)
    };

console.log(state);
.as-console-wrapper { max-height: 100% !important; top: 0; }

person Nina Scholz    schedule 11.01.2017

Использовать метод defaultProps

defaultProps можно определить как свойство самого класса компонента, чтобы установить реквизиты по умолчанию для класса. Это используется для неопределенных реквизитов, но не для нулевых реквизитов. Например:

class CustomButton extends React.Component {
  // ...
}

CustomButton.defaultProps = {
  color: 'blue'
};
person Abdullah Alsigar    schedule 11.01.2017
comment
Это на самом деле не отвечает на вопрос. Я имею в виду, что вам все равно придется явно установить для всех этих свойств значение null. - person CodingIntrigue; 11.01.2017
comment
Затем просто позвольте ему быть неопределенным, если вы не хотите устанавливать его один за другим. - person Abdullah Alsigar; 11.01.2017