2013-01-16 123 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);