Удалить строки, которые появляются в одном массиве из второго списка, если они существуют в OCaml / ReasonML - PullRequest
0 голосов
/ 07 марта 2020

У меня есть массивы дат, которые выглядят так:

let slots = [|
  "2014-08-11T10:00:00-04:00",
  "2014-08-11T10:30:00-04:00",
  "2014-08-11T11:00:00-04:00",
  "2014-08-11T11:30:00-04:00",
  "2014-08-11T12:00:00-04:00",
  "2014-08-11T12:30:00-04:00",
  "2014-08-11T13:00:00-04:00"
|];
let badSlots = [|
  "2014-08-11T11:00:00-04:00",
  "2014-08-11T11:30:00-04:00",
  "2014-08-11T12:00:00-04:00",
|];

Как мне удалить элементы из первого массива, которые появляются во втором массиве, чтобы получить результат:

result [
  '2014-08-11T10:00:00-04:00',
  '2014-08-11T10:30:00-04:00',
  '2014-08-11T12:30:00-04:00',
  '2014-08-11T13:00:00-04:00'
]

До сих пор я пробовал это по причине, которая, кажется, находит совпадения, но формат результата неверен.

let checkBool = s => Belt.Array.map(badSlots, bs => s !== bs);
let check = s =>
  Belt.Array.keepMap(badSlots, bs =>
    if (s !== bs) {
      Some(s);
    } else {
      None;
    }
  );
let checkBoolResult = Belt.Array.map(slots, s => checkBool(s));
Js.log2("checkBoolResult", checkBoolResult);
let checkResult = Belt.Array.keepMap(slots, s => Some(check(s)));
Js.log2("checkResult", checkResult);

Какие журналы:

checkBoolResult [
  [ true, true, true ],
  [ true, true, true ],
  [ false, true, true ],
  [ true, false, true ],
  [ true, true, false ],
  [ true, true, true ],
  [ true, true, true ]
]
checkResult [
  [
    '2014-08-11T10:00:00-04:00',
    '2014-08-11T10:00:00-04:00',
    '2014-08-11T10:00:00-04:00'
  ],
  [
    '2014-08-11T10:30:00-04:00',
    '2014-08-11T10:30:00-04:00',
    '2014-08-11T10:30:00-04:00'
  ],
  [ '2014-08-11T11:00:00-04:00', '2014-08-11T11:00:00-04:00' ],
  [ '2014-08-11T11:30:00-04:00', '2014-08-11T11:30:00-04:00' ],
  [ '2014-08-11T12:00:00-04:00', '2014-08-11T12:00:00-04:00' ],
  [
    '2014-08-11T12:30:00-04:00',
    '2014-08-11T12:30:00-04:00',
    '2014-08-11T12:30:00-04:00'
  ],
  [
    '2014-08-11T13:00:00-04:00',
    '2014-08-11T13:00:00-04:00',
    '2014-08-11T13:00:00-04:00'
  ]
]

Любое руководство будет ценится в любом синтаксисе. Спасибо.

1 Ответ

1 голос
/ 07 марта 2020

Через форум разногласий здесь :

Это решение работает:

let x = Js.Array.filter(x => !Array.mem(x, badSlots), slots);

//output
x [
  '2014-08-11T10:00:00-04:00',
  '2014-08-11T10:30:00-04:00',
  '2014-08-11T12:30:00-04:00',
  '2014-08-11T13:00:00-04:00'
]
...