Как упростить создание массива объектов, где кроме одного все свойства одинаковы? - PullRequest
0 голосов
/ 08 февраля 2019

const errorMessage = "some error message";
const fieldName = "the field name";

const newFieldRules = [{
    custom: false,
    errorMessage: errorMessage,
    fieldName: fieldName,
    validatorName: `digits`
  },
  {
    custom: false,
    errorMessage: errorMessage,
    fieldName: fieldName,
    validatorName: `min`
  },
  {
    custom: false,
    errorMessage: errorMessage,
    fieldName: fieldName,
    validatorName: `max`
  }
];

Мне нужно создать вышеуказанный массив.Как видите, у всех объектов несколько свойств одинаковы.

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

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Вероятно, так:

const errorMessage = "some error message";
const fieldName = "the field name";

const defaultObj = {
    custom: false,
    errorMessage: errorMessage,
    fieldName: fieldName,
}


const newFieldRules = [
    {...defaultObj, validatorName: 'digits'},
    {...defaultObj, validatorName: 'min'},
    {...defaultObj, validatorName: 'max'},
]

console.log(newFieldRules)

Использовался синтаксис распространения .

0 голосов
/ 08 февраля 2019

Вот еще один способ сделать это, используя многократно используемую mapper функцию высшего порядка , которая использует структуру отображения, ключи которой будут соответствовать выходным данным, а значения - это либо значения для использования, либо функция длясгенерируйте эти значения.

Mapper возвращает функцию отображения, которая может быть вызвана с данными для генерации вашего вывода.Здесь используется простой индекс.

Используя этот шаблон, вы можете легко генерировать сложный вывод при сохранении краткого кода, поскольку вы определяете mapper только один раз.

const mapper = obj => val => Object.entries(obj).reduce((accum, [key, fnOrVal]) => {
  accum[key] = fnOrVal instanceof Function ? fnOrVal(val) : fnOrVal;
  return accum;
}, {});

const newFieldRulesGenerator = mapper({
    custom: false,
    errorMessage: 'some error message',
    fieldName: 'fieldName',
    validatorName: i => ['digits', 'min', 'max'][i]
});

const newFieldRules = [0, 1, 2].map(newFieldRulesGenerator);

console.log(newFieldRules);
0 голосов
/ 08 февраля 2019

Это избавляет от повторения, используя Array.prototype.map:

const errorMessage = "some error message";
const fieldName = "the field name";

const newFieldRules = [`digits`, `min`, `max`].map(validatorName => ({
    custom: false,
    errorMessage,
    fieldName,
    validatorName
}));

console.log(newFieldRules);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...