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`
}
];
我需要创建上面的数组。如您所见,所有对象的属性很少。
有什么方法可以改善这段代码,以避免重复吗?
答案 0 :(得分:5)
使用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);
答案 1 :(得分:1)
可能是这样的:
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)
Spread syntax被使用。
答案 2 :(得分:0)
这是使用可重用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);