2013-01-16 57 views
5

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

下面是一个示例代码:

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); 
+2

你能告诉你如何从Java调用JavaScript? –

+0

[这](http://stackoverflow.com/questions/2644966/javascript-iterator-class)可能有帮助 – TheWhiteRabbit

+0

他不应该使用Struts或其他?我认为用户将Java和Javascript混淆在一起?只是读他的问题,我很困惑。 – Sanchit

回答

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(); 
} 

它的工作原理。

+0

如果这样工作,你可以尝试'为(房间里的var房间)'以及 – soulcheck

+0

嗯。是。据我所知,JavaScript的'for in'循环遍历对象属性。方法也是属性 - 那么为什么你要获得方法列表。我不确定''in'循环与java集合是否合作。 –

+0

@NikitaBeloglazov我猜测,不知道任何有关环境。当你在js中处理java对象时,什么被视为属性?一切?具有get/set的java属性?地图怎么样? – soulcheck

4

要使用for in你必须把它转换to an array第一:

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); 

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

如果您正在使用犀牛1.7或以上,你可以使用它的non-standard iterator support

for (i in Iterator(coll)) print(i);