Js.js_array из Javascript; принудительно, получить / установить

У меня есть массив объектов в моем файле Javascript, к которому мне нужно получить доступ из js_of_ocaml. Я придумал это до сих пор:

let table_decks = (Js.Unsafe.variable "table_decks" :> 
  < deck_nr : int > Js.js_array Js.t)

В Javascript массив будет выглядеть как table_decks = {{deck_nr: 10, ...}, {deck_nr: 20, ...}} с большим количеством полей, чем просто deck_nr,

Мой вопрос: как мне получить доступ к этому массиву? Я нахожу много функций в Js.js_array, но не получить / установить.

(Другой вопрос, является ли принуждение действительно правильным?)

1 ответ

Решение

Используйте Js.array_get/array_set или Js.Unsafe.get/set.

val array_get : 'a #js_array t -> int -> 'a optdef
val array_set : 'a #js_array t -> int -> 'a -> unit

Для поддержки перегрузки в ocaml, js_of_ocaml удаляет буквы после последней _ в имени javascript. Таким образом, "deck_nr" становится "deck" в сгенерированном js, поэтому добавьте еще один "_".

Соберите все это вместе...

let table_decks = (Js.Unsafe.variable "table_decks" :>
  < deck_nr_ : int Js.prop > Js.t Js.js_array Js.t)

let get a n =
  match Js.Optdef.to_option (Js.array_get a n) with
  | Some n -> n##deck_nr_
  | None -> 0
Другие вопросы по тегам