从for循环中的函数回调返回值

Ale*_*dro 1 javascript reselect

我有以下for循环:

import { createSelector } from 'reselect';

let dirtyForm;

export const isFormDirty = createSelector(
    getForms,
    getState,
    (forms, state) => {
        for(let i = 0; i < forms.length; i += 1){
            dirtyForm = isDirty(forms[i])(state);
        }

        return dirtyForm;
    }
);
Run Code Online (Sandbox Code Playgroud)

isDirty from从表单数组中获取单个表单名称,并检查表单是否已被编辑.我循环使用表单名称的原因是为了查看屏幕上可用的表单是否已被编辑.

它有效但在这种情况下有没有办法完全不使用for循环?

meh*_*kin 5

最后一个表单的状态将始终覆盖循环中的其他表单.

如果您要检测是否有任何一个表单是脏的,您可以使用Array.prototype.some():

export const isFormDirty = createSelector(
    getForms,
    getState,
    (forms, state) => forms.some(form => isDirty(form)(state)) // Will return true if one of the forms are dirty, false if all forms are clean
);
Run Code Online (Sandbox Code Playgroud)

或者,正如@Danmoreng在评论中建议的那样,你可以保持循环,并通过添加对自身的ORDing dirtyForm来防止覆盖:

for (let i = 0; i < forms.length; i += 1) {

    // Once true, further results will not be evaluated, so no overrides
    dirtyForm = dirtyForm || isDirty(forms[i])(state);
}
Run Code Online (Sandbox Code Playgroud)

或者,正如@Icepickle在评论中建议的那样,一旦遇到脏表单,您就可以简单地打破循环:

for (let i = 0; i < forms.length; i += 1) {

    // Exit the loop by returning true if a form is dirty
    // Might be wise to add a "return false;" outside the loop with this approach.
    if(isDirty(forms[i])(state)) {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Danmoreng您可能会从循环中提前退出,如果一个人很脏,那么看起来好像知道表单很脏 (2认同)