Я думаю, что имеет смысл сначала обработать ваши данные:
Установить
checkboxes
не обязательно должен быть список объектов(например, [{id:1},{id:2}]
).Это может быть просто список идентификаторов (например, [1,2]
) - Я не уверен, что есть много смысла в перечислении всех принятых сумм.Просто укажите максимальное значение, которое может иметь каждая сумма
Итак, преобразуйте:
{id: 2, checkboxes: [{id: 30}, {id: 40}], valid_amount: [1,2]},
в:
{id: 2, checkboxes: [30, 40], max_amount: 2}
Вот функция для этого:
const transformSet = set => ({
id: set.id,
checkboxes: map(prop('id'), set.checkboxes),
max_amount: last(set.valid_amount)
});
Флажки
Кажется (поправьте меня, если я ошибаюсь), что вы заботитесь только о тех объектах, для которых value
имеет значение true
.В этом случае я бы удалил те, для которых value
установлен на false
и оставил бы только идентификаторы.
Так что преобразовав
[
{id: 10, value: true},
{id: 20, value: true},
{id: 30, value: true},
{id: 40, value: true},
{id: 50, value: true},
{id: 60, value: false},
{id: 70, value: true},
{id: 80, value: false},
]
в:
[10, 20, 30, 40, 50, 70]
Вот функция для этого:
const transformCheckboxes = into([], compose(
reject(propEq('value', false)),
map(prop('id'))
));
Почему?
Давайте рассмотрим набор № 1, выяснить, был ли ответ отправлен, так же простокак нахождение пересечения двух массивов:
пересечение ([10, 20], [10, 20, 30, 40, 50, 70]) // => [10, 20]
Затем вам нужно убедиться, что длина массива не превышает максимальную сумму для этого набора:
const selectCheckboxes = curry((checkboxes, set) =>
pipe(intersection, length, gte(set.max_amount))
(set.checkboxes, checkboxes));
Теперь вы можете перебирать свои наборы и возвращать первый набор, для которого selectCheckboxes
не возвращает истину.(Обратите внимание на использование complement(selectCheckboxes)
:
const findError = useWith(find, [
compose(complement(selectCheckboxes), transformCheckboxes),
map(transformSet)]);
const {curry, into, intersection, length, gte, map, prop, reject, last, useWith, find, compose, propEq, complement, pipe} = R;
const sets = [
{id: 1, checkboxes: [{id: 10}, {id: 20}], valid_amount: [1]},
{id: 2, checkboxes: [{id: 30}, {id: 40}], valid_amount: [1,2]},
{id: 3, checkboxes: [{id: 50}, {id: 60}, {id: 70}, {id: 80}], valid_amount: [1,2,3,4]},
];
const submittedCheckboxes = [
{id: 10, value: true},
{id: 20, value: true},
{id: 30, value: true},
{id: 40, value: true},
{id: 50, value: true},
{id: 60, value: false},
{id: 70, value: true},
{id: 80, value: false},
];
const transformSet = set => ({
id: set.id,
checkboxes: map(prop('id'), set.checkboxes),
max_amount: last(set.valid_amount)
});
const transformCheckboxes = into([], compose(
reject(propEq('value', false)),
map(prop('id'))
));
const selectCheckboxes = curry((checkboxes, set) =>
pipe(intersection, length, gte(set.max_amount))
(set.checkboxes, checkboxes));
const findError = useWith(find, [
compose(complement(selectCheckboxes), transformCheckboxes),
map(transformSet)]);
console.log(
findError(submittedCheckboxes, sets)
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>