2013-01-16 21 views
5

Tôi đang cố gắng làm kịch bản với Javascript trong một chương trình Java. Tôi đã không tìm thấy một cách để lặp qua một bộ sưu tập Java trong Javascript. Nếu tôi gọi phương thức iterator() cho bộ sưu tập, tôi lấy tên phương thức thay vì các phần tử.Làm thế nào để lặp qua bộ sưu tập Java trong Javascript

Dưới đây là một số mẫu mã:

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

Các apartment.getRooms() trả về một tập hợp các phòng. Khi tôi nghiên cứu giá trị được trả về bởi hàm này, tôi biết rằng nội dung của nó là chính xác, nhưng các giá trị được in ra là các tên phương thức.

tôi gọi javascript từ chương trình Java của tôi như thế này:

getInvocable().invokeFunction("getValue", row, components); 
+2

Bạn có thể hiển thị như thế nào bạn gọi javascript từ java? –

+0

[This] (http://stackoverflow.com/questions/2644966/javascript-iterator-class) có thể giúp – TheWhiteRabbit

+0

Không nên dùng Struts hay gì đó? Tôi nghĩ người dùng đang nhầm lẫn giữa Java và Javascript với nhau? Tôi khá bối rối chỉ đọc câu hỏi của anh ấy. – Sanchit

Trả lời

7

Dường như nếu tôi làm lặp như sau:

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

Nó hoạt động.

+0

nếu điều đó làm việc bạn có thể thử 'for (var phòng trong phòng)' cũng – soulcheck

+0

Hm. Vâng. Như tôi biết vòng lặp for for' của javascript lặp qua các thuộc tính của đối tượng. các phương thức cũng là các thuộc tính - thì tại sao bạn nhận danh sách các phương thức. Tôi không chắc chắn 'cho in' vòng lặp hoạt động tốt với các bộ sưu tập java. –

+0

@NikitaBeloglazov tôi đã đoán, mà không biết gì về môi trường. Điều gì được coi là thuộc tính khi bạn đang xử lý các đối tượng java trong js? Mọi điều? java thuộc tính với get/set? Còn Maps thì sao? – soulcheck

4

Để sử dụng for in bạn sẽ phải chuyển đổi nó to an array đầu tiên:

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

Nếu không, bạn sẽ lặp qua các thuộc tính đối tượng.

Nếu bạn đang sử dụng Rhino 1.7 trở lên, bạn có thể sử dụng nó non-standard iterator support:

for (i in Iterator(coll)) print(i); 
Các vấn đề liên quan