Возвращаемое значение из обратного вызова функции в цикле for - PullRequest
0 голосов
/ 01 октября 2018

У меня есть следующее для цикла:

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 в этом случае?

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

export const isFormDirty = createSelector(
    getForms,
    getState,
    (forms, state) => forms.some(form => isDirty(form)(state))
);

РЕДАКТИРОВАТЬ: Удалена карта за отличный совет в комментариях

0 голосов
/ 01 октября 2018

Используйте Array.some(), чтобы определить, имеет ли массив истинное условное значение.Выход рано и очень чистый и непревзойденный.

0 голосов
/ 01 октября 2018

Состояние последней формы всегда будет переопределять другие в вашем цикле.

Если вы пытаетесь определить, является ли любая одна из форм грязной, вы можете использовать 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 '' флаг 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;
    }
}
...