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

标签 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;
    }
);

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

它可以工作,但是在这种情况下有没有办法完全不必使用 for 循环?

最佳答案

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

如果你想检测是否任何其中一个表单是脏的,你可以使用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
);

或者,正如@Danmoreng 在评论中建议的那样,您可以保留循环,并通过将 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);
}

或者,正如@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;
    }
}

关于javascript - 从 for 循环中的函数回调返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52594437/

相关文章:

javascript - 你如何使用 `reselect` 来内存一个数组?

javascript - 页面特定的 javascript 函数

javascript - knex.js 迁移中的时间戳字段

javascript - 模拟不同选择器的点击事件

reactjs - Redux Toolkit 中 createSelector 和 createDraftSafeSelector API 的区别

reactjs - 重新选择错误 : Selector creators expect all input-selectors to be functions

javascript - 当我从 mapstatetoprops 调用它时,Redux Selector 没有触发

javascript - 为什么数据无法在viewpage中显示?

javascript - 如何使用 HTML、CSS 和 JavaScript 根据值更改行的背景颜色?

reactjs - redux reselect 正在返回一个函数