我有以下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从forms数组中获取单个表单名称,并检查表单是否已被编辑。我遍历表单名称的原因是找出屏幕上可用的表单是否已被编辑。
它可以工作,但是在这种情况下有没有办法完全不用for循环?
答案 0 :(得分: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
);
或者,如@Danmoreng在评论中所建议的那样,您可以保持循环,并通过对其本身加上OR'ingdirtyForm标志来防止覆盖:
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;
}
}
答案 1 :(得分:1)
使用Array.some()
检测数组是否具有真实的条件值。提早退房,非常干净和有礼貌。
答案 2 :(得分:0)
export const isFormDirty = createSelector(
getForms,
getState,
(forms, state) => forms.some(form => isDirty(form)(state))
);
编辑:根据评论中的出色建议删除地图