5

我正在尝试在 Java 程序中使用 Javascript 编写脚本。我还没有找到一种方法来遍历 Javascript 中的 Java 集合。如果我为集合调用 iterator() 方法,我会得到方法名称而不是元素。

这是一个示例代码:

function getValue(row, components) {
    var apartment = components.get(0);
    var rooms = apartment.getRooms();
    for (var room in rooms.iterator()) {
        println(room);
    }
    return rooms.toString();
}

apartment.getRooms() 返回房间的集合。当我研究这个函数返回的值时,我知道它的内容是正确的,但是打印出来的值是方法名。

我从我的 Java 程序中调用 Javascript,如下所示:

getInvocable().invokeFunction("getValue", row, components);
4

2 回答 2

7

看来,如果我按如下方式进行迭代:

function getValue(row, components) {
    var apartment = components.get(0);
    var rooms = apartment.getRelated();
    for (var iterator = rooms.iterator(); iterator.hasNext();) {
        var room = iterator.next();
        println(room);
    }
    return rooms.toString();
}

有用。

于 2013-01-16T13:40:30.803 回答
4

要使用for in,您必须先将其转换为数组

Collection<String> coll = Arrays.asList("foo", "bar", "baz");

String script = "var arr = coll.toArray();\n"
    + "for(var idx in arr) println(arr[idx]);\n";

ScriptEngine engine = new ScriptEngineManager()
    .getEngineByName("ECMAScript");
engine.getContext().setAttribute("coll", coll, ScriptContext.ENGINE_SCOPE);
engine.eval(script);

否则,您将遍历对象属性。

如果您使用的是 Rhino 1.7 或更高版本,您可以使用它的非标准迭代器支持

for (i in Iterator(coll)) print(i);
于 2013-01-16T13:48:21.503 回答