2011-08-25 21 views
5

tôi bằng cách nào đó nhầm lẫn:cho (... tại ...) không làm việc với mảng

tôi có một danh sách các lệnh như thế này:

var commands = [{"command": "read"}, {"command": "write"}, {"command": "login"}]; 

Nếu tôi thử nó truy cập một trong các lệnh như thế này nó hoạt động:

console.log(commands[0]["command"]); // Output is "read" 
console.log(commands[0].command); // Output is "read" 

Nhưng nếu tôi cố gắng này đầu ra luôn là undefined:

for(command in commands) 
    console.log(command["command"]); // undefined, undefined, undefined 
+0

Nếu lệnh của bạn biến là json, bạn cũng có thể làm điều này http://jsfiddle.net/aMTTU/ –

+3

Mặc dù một số câu trả lời dưới đây, không 'for-in' một mảng. Đó là công cụ sai cho công việc trong JavaScript. Vòng lặp 'for' hoặc phương thức' forEach' chỉ đảm bảo các chỉ số dạng số theo thứ tự được bảo đảm và không chặn khả năng mở rộng 'Array.prototype' nếu bạn chọn. – user113716

Trả lời

2

Tại sao sử dụng for..in với một mảng? Chỉ cần truy cập bằng cách chỉ số, và bạn cũng tránh vấn đề tiềm ẩn phần mở rộng nguyên mẫu (xem hasOwnProperty)

var i,len=commands.length; 

for (i=0;i<len;i++) { 
    console.log commands[i].command 
} 

Nếu tự không quan trọng, chính xác hơn

for (i=commands.length-1;i>=0;i--) { 

} 

Hoặc

var i=commands.length; 
while (i--) { 
    ... 
} 
2

Sử dụng nó như thế này

for(var x in commands) 
     console.log(commands[x].command); 
6

for không một lần lặp mảng trong javascript, vì vậy bạn muốn:

for(command in commands) 
    console.log(commands[command]["command"]); 

tức là, command biến trong ví dụ của bạn là một chỉ số mảng, không phải là mục liệt kê từ mảng.

+0

Ngoài ra: bạn có thể sử dụng kiểu hàm choEach/every/any =) – slezica

+0

@Santiago - Tôi không biết ý bạn là gì, cẩn thận để xây dựng? – Jamiec

+0

Không, câu trả lời của bạn hoàn hảo! Tôi đã giải quyết OP. Đối với hành vi anh ta muốn, anh ta có thể sử dụng forEach. – slezica

1

Các bạn đã thử:

for(command in commands[0]) { 
    console.log(command["command"]); 
} 
+0

Điều đó sẽ không hoạt động bởi vì 'lệnh [0] .command' là chuỗi' "đọc" ', do đó, lệnh' [0] .command ["command"] 'sẽ cho bạn' undefined'. – user113716

5

Các for ... in lặp cấu trúc so với phím của các đối tượng trong mảng, không phải là đối tượng chính mình. Vì vậy, bạn cần phải viết:

for(index in commands) 
    console.log(commands[index]["command"]); 
+1

+1 để đề cập đến * phím *. –

2

Cấu trúc for (.. in ..) dùng để lặp qua đối tượng chứ không phải mảng. Vì bạn có một mảng của các đối tượng, bạn nên làm:

for (var i = 0, j = commands.length; i < j; i += 1) { 
    console.log(commands[i].command); 
} 

Đối với một lời giải thích kỹ như lý do tại sao bạn nên sử dụng for cấu trúc này thay cho for...in, xem answer #3010848.

+0

Nhưng OP đang tạo một đối tượng chứ không phải mảng ... –

+1

Uh, không, anh ta đã xác định rõ ràng một mảng các đối tượng mà anh ta muốn lặp: 'var commands = [{" command ":" read "}, {" command ":" write "}, {" command ":" login "}];' –

+1

@Martin Trên thực tế OP đang tạo một mảng các đối tượng. Mảng là những gì đang được lặp qua đó là tự nhiên hơn như là một vòng lặp 'for'. –

Các vấn đề liên quan