Arrays
JavaScript arrays are objects that support storing properties indexed by integers. Neon exposes access to this class through the JsArray type.
Creating Arrays#
The easiest way to create a new array is through the Context::empty_array() method:
let a: Handle<JsArray> = cx.empty_array();This is the equivalent of writing:
const a = [];or
const a = new Array();in JavaScript.
Indexed Properties#
You can get and set indexed properties of an array, i.e., properties with integer property keys, with the Object::get() and Object::set() methods:
let a = cx.empty_array();
let s = cx.string("hello!");
a.set(&mut cx, 0, s)?;
let v = a.get(&mut cx, 1)?;This is equivalent to the JavaScript code:
const a = [];
const s = "hello!";
a[0] = s;
const v = a[1];Extending an Array#
The length of a JavaScript array is one more than its largest property index, which can be determined by calling the JsArray::len() method. You can extend the length of array by adding a property at that index:
let len = array.len(&mut cx)?;array.set(&mut cx, len, value)?;This is equivalent to the JavaScript code:
const len = array.length;array[len] = value;Converting a Rust Vector to an Array#
An iterable Rust data structure such as Vec can be converted to a JavaScript array by looping over the elements. The JsArray::new() method can be used to preallocate enough capacity for the number of elements.
fn vec_to_array<'a, C: Context<'a>>(vec: &Vec<String>, cx: &mut C) -> JsResult<'a, JsArray> { let a = JsArray::new(cx, vec.len() as u32);
for (i, s) in vec.iter().enumerate() { let v = cx.string(s); a.set(cx, i as u32, v)?; }
Ok(a)}Converting a JavaScript Array to a Vector#
The JsArray::to_vec() method makes it easy to convert a JavaScript array to a Rust vector:
let vec: Vec<Handle<JsValue>> = arr.to_vec(&mut cx);