理解return关键字

时间:2018-03-14 18:19:52

标签: javascript return

我有这个:

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}我似乎也没有得到相同的结果。我对回归的误解是什么?

4 个答案:

答案 0 :(得分:1)

在第一个示例中,您只有一个(箭头)函数返回falseundefined

在第二个示例中,您的外部(箭头)函数永远不会返回任何内容 - 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))