Генерация новых массивов из массива с объектами с определенными идентификаторами - PullRequest
0 голосов
/ 14 февраля 2019

Мы используем ramda в нашем проекте, и у меня есть эти структуры данных, и мне нужно сделать следующее:

Для каждого набора проверить, есть ли в нем submittedCheckboxes, и изолировать их для нового массива.так что я могу знать, не превышено ли количество valid_amount флажков, установленных на true.

В приведенном ниже примере должно выдаваться сообщение об ошибке, указывающее идентификатор набора # 1, так как два из submittedCheckboxes имеютvalue: true, где набор указывает valid_amount: [1], но набор # 2 должен подойти, так как опции valid_amount имеют значение 1 или 2 (valid_amount: [1,2]).Последний набор должен принимать каждое количество отмеченных флажков, принадлежащих ему.

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},
];

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Я думаю, что имеет смысл сначала обработать ваши данные:

Установить

  1. checkboxes не обязательно должен быть список объектов(например, [{id:1},{id:2}]).Это может быть просто список идентификаторов (например, [1,2])
  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>
0 голосов
/ 14 февраля 2019

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},
];
console.log(sets.map(valid));

function valid(set) {
	return set.valid_amount.includes(set.checkboxes.filter(checkbox => submittedCheckboxes.find(set=>set.id === checkbox.id).value).length)
}
...