gpt4 book ai didi

java - 使用 graal.js 通过 Java 访问 JavaScript 数组

转载 作者:行者123 更新时间:2023-12-01 19:56:30 26 4
gpt4 key购买 nike

我正在将一个项目从 Nashorn 迁移到 graal.js。该项目使用了大量的脚本(超过3,400个),并且Java端有一个调用方法的函数;该方法返回 JavaScript 对象列表。

function filterList(ob)
{
var list = [];
var arr = ob.toArray();

for(var i = 0; i < arr.length; i++)
{
if(global.isValid(arr[i]))
{
list.push(arr[i]);
}
}

return list;
}

之前使用 ScriptUtils 在 Nashorn 上效果很好。该代码是由在我选择该项目之前参与该项目的开发人员编写的:

try {
Object p = iv.invokeFunction("filterList", this.getList());

if(p != null) {
List<MyObj> lObj = new ArrayList<>(((Map<String, MyObj>)(ScriptUtils.convert(p, Map.class))).values());
return lObj;
}
} catch (ScriptException | NoSuchMethodException ex) {
ex.printStackTrace();
}

如何使用 graal.js 通过 Java 访问数组?我尝试使用 Value.asValue(p)as(MyObj[]) 无济于事。我还尝试遵循 Nashorn 迁移指南,他们建议将对象转换为列表或 map ,但也无济于事。

我知道一个解决方案,我必须重写脚本才能仅使用 new Java.type('java.util.ArrayList'); 并返回 List 而不是数组 - 然而有数千个脚本,重写所有脚本将非常乏味。

最佳答案

您可以使用 Value.getArraySize() 和 Value.getArrayElement(index):

Context context = Context.newBuilder("js").build();
Value result = context.eval("js", "var list=[1,2,'foo',true]; list;");
if (result.hasArrayElements()) {
for (int i=0;i<result.getArraySize();i++) {
System.out.println(result.getArrayElement(i));
}
}

您可以在 https://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/Value.html 中找到 Value 类的完整 JavaDoc。

最好,克里斯蒂安

关于java - 使用 graal.js 通过 Java 访问 JavaScript 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59038352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com