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