我有这个:
validateForm = () => {
for (let i = 0; i < formInputs.length; i++) {
const inputName = formInputs[i];
if (!this.state.form[inputName].length) {
return false;
}
}
}
我正在重构:
validateForm2 = () => {
Object.keys(this.state.form).map(input => {
if(!this.state.form[input].length) {
return false
}
return true;
})
}
第一个有效,当我填写表单并且函数返回true时,如果一个为空,则返回false。
然而我似乎不太了解return
关键字以获得相同的结果。
Object.keys说它返回一个数组,但即使我说return Object.keys...
或else {return true}
我似乎也没有得到相同的结果。我对回归的误解是什么?
答案 0 :(得分:1)
在第一个示例中,您只有一个(箭头)函数返回false
或undefined
。
在第二个示例中,您的外部(箭头)函数永远不会返回任何内容 - undefined
到调用代码,而第二个函数作为参数传递给Array.map
方法。参数函数中的return
语句不会从外部函数返回任何内容。
validateForm2 = () => {
var emptyItems = Object.keys(this.state.form).filter(input => {
return !this.state.form[input].length;
});
return emptyItems.length == 0;
}
答案 1 :(得分:1)
您可以使用Array#every
,它使用短路的返回值并返回所有真实项目的检查。
validateForm2 = () =>
Object.keys(this.state.form).every(input => this.state.form[input].length);
Array#map
将返回值用作新数组的每个数组项的新项,在给定的示例中将其作为参考。
答案 2 :(得分:0)
您可以修改您的功能以执行您想要的操作。
validateForm2 = () => {
return Object.keys(this.state.form).every(input => {
return this.state.form[input].length;
})
}
您正在检查每个属性是否有长度(true)。如果其中一个没有,则函数返回false。
答案 3 :(得分:0)
我认为你可以避免使用.map
来支持.every()
,它会迭代每一个元素,并检查它的长度是否大于零。
const validateForm = (form) => Object.values(form).every((field) => field.length);
let semiEmptyForm = {
firstField : "",
secondfield : "notEmpty"
};
let nonEmptyForm = {
firstField : "notEmpty",
secondfield : "notEmpty"
};
console.log(validateForm(semiEmptyForm))
console.log(validateForm(nonEmptyForm))