如何使用 Node-API 迭代 JavaScript 数组
How to iterate JavaScript array using Node-API
我正在构建 Node.js addon using Node-API。
基本上,我的算法将 js 数组作为输入,然后在插件中处理它并 return 它。
要对数组执行任何逻辑,我需要循环遍历它。但我不知道怎么做。因为我没有在他们的文档或者examples.
中找到任何数组迭代相关的文档
所以我认为这更多是关于在 C
中进行的。我在下面的代码中添加了我尝试过的内容,但没有用,我在下面的代码中将其注释掉了。
我也试图在里面找到任何有用的东西 nodejs source code and node-addon-api 但是由于我对此的了解有限,所以我没有。
请指导我如何循环访问该数组中的每个对象。
napi_value avm_simplify(napi_env env, napi_callback_info info) {
napi_status status;
napi_value value;
size_t argc = 1;
napi_value args[1];
status = napi_get_cb_info(env, info, &argc, args, NULL, NULL);
STATUS_CHECK
if (argc < 1) {
napi_throw_type_error(env, NULL, WRONG_ARGUMENTS_ERROR);
return NULL;
}
bool is_array = 0;
status = napi_is_array(env, args[0], &is_array);
STATUS_CHECK
if (!is_array) {
napi_throw_type_error(env, NULL, "Argument type should be an array");
return NULL;
}
// args[0] equals to something like
// [1, 2, 3, 4, 5]
// which is the user input (js array)
napi_value array = args[0];
/*
// This is what I wan't to do.
int length = sizeof(array) / sizeof(array[0]);
for (size_t i = 0; i < length; i++) {
napi_value object = array[i];
// do some logic with object
}
*/
return value;
}
我知道使用 C++
应该更容易,但我的模块将来主要引用 C
库。
提前致谢。
我发现 https://nodejs.org/api/n-api.html 读起来不错
这是我将如何迭代(添加状态检查)
uint32_t length;
status = napi_get_array_length(env, array, &length);
for (uint32_t i = 0; i < length; ++i) {
napi_value ret;
napi_get_element(env, array, i, &ret);
int32_t myint;
napi_get_value_int32(env, ret, &myint);
下面是输入数组的每个元素乘以 2 的示例
// hello.cc using Node-API
#include <node_api.h>
#include <assert.h>
namespace demo {
napi_value Method(napi_env env, napi_callback_info info) {
napi_status status;
napi_value value;
size_t argc = 1;
napi_value args[1];
status = napi_get_cb_info(env, info, &argc, args, NULL, NULL);
assert(status == napi_ok);
if (argc < 1) {
napi_throw_type_error(env, NULL, "Wrong number of arguments");
return NULL;
}
bool is_array = 0;
status = napi_is_array(env, args[0], &is_array);
assert(status == napi_ok);
if (!is_array) {
napi_throw_type_error(env, NULL, "Argument type should be an array");
return NULL;
}
// args[0] equals to something like
// [1, 2, 3, 4, 5]
// which is the user input (js array)
napi_value array = args[0];
if (!array) {
std::cout<<"array is null"<<std::endl;
return NULL;
}
uint32_t length;
status = napi_get_array_length(env, array, &length);
for (uint32_t i = 0; i < length; ++i) {
napi_value ret;
napi_get_element(env, array, i, &ret);
int32_t myint;
napi_get_value_int32(env, ret, &myint);
napi_value result;
napi_create_int32(env, myint * 2, &result);
napi_set_element(env, array, i, result);
}
return array;
}
// copy pasted
napi_value init(napi_env env, napi_value exports) {
napi_status status;
napi_value fn;
status = napi_create_function(env, nullptr, 0, Method, nullptr, &fn);
if (status != napi_ok) return nullptr;
status = napi_set_named_property(env, exports, "hello", fn);
if (status != napi_ok) return nullptr;
return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, init)
} // namespace demo
我正在构建 Node.js addon using Node-API。
基本上,我的算法将 js 数组作为输入,然后在插件中处理它并 return 它。
要对数组执行任何逻辑,我需要循环遍历它。但我不知道怎么做。因为我没有在他们的文档或者examples.
中找到任何数组迭代相关的文档所以我认为这更多是关于在 C
中进行的。我在下面的代码中添加了我尝试过的内容,但没有用,我在下面的代码中将其注释掉了。
我也试图在里面找到任何有用的东西 nodejs source code and node-addon-api 但是由于我对此的了解有限,所以我没有。
请指导我如何循环访问该数组中的每个对象。
napi_value avm_simplify(napi_env env, napi_callback_info info) {
napi_status status;
napi_value value;
size_t argc = 1;
napi_value args[1];
status = napi_get_cb_info(env, info, &argc, args, NULL, NULL);
STATUS_CHECK
if (argc < 1) {
napi_throw_type_error(env, NULL, WRONG_ARGUMENTS_ERROR);
return NULL;
}
bool is_array = 0;
status = napi_is_array(env, args[0], &is_array);
STATUS_CHECK
if (!is_array) {
napi_throw_type_error(env, NULL, "Argument type should be an array");
return NULL;
}
// args[0] equals to something like
// [1, 2, 3, 4, 5]
// which is the user input (js array)
napi_value array = args[0];
/*
// This is what I wan't to do.
int length = sizeof(array) / sizeof(array[0]);
for (size_t i = 0; i < length; i++) {
napi_value object = array[i];
// do some logic with object
}
*/
return value;
}
我知道使用 C++
应该更容易,但我的模块将来主要引用 C
库。
提前致谢。
我发现 https://nodejs.org/api/n-api.html 读起来不错
这是我将如何迭代(添加状态检查)
uint32_t length;
status = napi_get_array_length(env, array, &length);
for (uint32_t i = 0; i < length; ++i) {
napi_value ret;
napi_get_element(env, array, i, &ret);
int32_t myint;
napi_get_value_int32(env, ret, &myint);
下面是输入数组的每个元素乘以 2 的示例
// hello.cc using Node-API
#include <node_api.h>
#include <assert.h>
namespace demo {
napi_value Method(napi_env env, napi_callback_info info) {
napi_status status;
napi_value value;
size_t argc = 1;
napi_value args[1];
status = napi_get_cb_info(env, info, &argc, args, NULL, NULL);
assert(status == napi_ok);
if (argc < 1) {
napi_throw_type_error(env, NULL, "Wrong number of arguments");
return NULL;
}
bool is_array = 0;
status = napi_is_array(env, args[0], &is_array);
assert(status == napi_ok);
if (!is_array) {
napi_throw_type_error(env, NULL, "Argument type should be an array");
return NULL;
}
// args[0] equals to something like
// [1, 2, 3, 4, 5]
// which is the user input (js array)
napi_value array = args[0];
if (!array) {
std::cout<<"array is null"<<std::endl;
return NULL;
}
uint32_t length;
status = napi_get_array_length(env, array, &length);
for (uint32_t i = 0; i < length; ++i) {
napi_value ret;
napi_get_element(env, array, i, &ret);
int32_t myint;
napi_get_value_int32(env, ret, &myint);
napi_value result;
napi_create_int32(env, myint * 2, &result);
napi_set_element(env, array, i, result);
}
return array;
}
// copy pasted
napi_value init(napi_env env, napi_value exports) {
napi_status status;
napi_value fn;
status = napi_create_function(env, nullptr, 0, Method, nullptr, &fn);
if (status != napi_ok) return nullptr;
status = napi_set_named_property(env, exports, "hello", fn);
if (status != napi_ok) return nullptr;
return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, init)
} // namespace demo