2013-09-26 146 views
7

Trong đoạn mã dưới đây, JSONObject.length là 2:Tại sao JSONObject.length không được xác định?

var JSONObject = [{ 
    "name": "John Johnson", 
    "street": "Oslo West 16", 
    "age": 33, 
    "phone": "555 1234567" 
}, { 
    "name": "John Johnson", 
    "street": "Oslo West 16", 
    "age": 33, 
    "phone": "555 1234567" 
}]; 

Tuy nhiên, trong đoạn code dưới đây, JSONObject.length là undefined. Tại sao?

var JSONObject = { 
    "name": "John Johnson", 
    "street": "Oslo West 16", 
    "age": 33, 
    "phone": "555 1234567" 
}; 
+7

Chào mừng bạn đến với StackOverflow! Hãy để tôi cung cấp cho bạn một vài gợi ý về cách làm cho câu hỏi này tốt hơn cho người khác trả lời. Trước tiên, tôi khá chắc chắn bạn đang thiếu mã: mã bạn hiện không cung cấp bất kỳ lỗi nào như vậy. Thứ hai, hãy định dạng mã của bạn: bạn có thể làm điều này bằng cách chọn mã của bạn sau đó nhấn vào nút "Mã mẫu" trong thanh biểu tượng phía trên hộp văn bản (có vẻ như Grammin đã làm điều này cho bạn). Cuối cùng, hãy đảm bảo câu hỏi của bạn bao gồm mẫu mã, lỗi bạn nhận được và OUTPUT EXPECTED. Vui lòng đọc [Hỏi] để biết thêm thông tin. –

+1

* "' var JSONObject = ... '" * Đó không phải là đối tượng JSON, nó là đối tượng JavaScript. Cụ thể, đó là một mảng JavaScript. [JSON] (http://json.org) là một ký hiệu trao đổi dữ liệu văn bản. Mã nguồn không phải là JSON. –

+1

Tại sao điều này đóng lại? Mặc dù bài đăng gốc không được định dạng tốt, nhưng câu hỏi là hợp lệ và vấn đề hiện tại khá rõ ràng (đối tượng JavaScript không có thuộc tính '.length' kế thừa). – user113215

Trả lời

14

JavaScript không có thuộc tính .length cho đối tượng. Nếu bạn muốn làm việc nó ra, bạn phải tự lặp qua đối tượng.

function objLength(obj){ 
    var i=0; 
    for (var x in obj){ 
    if(obj.hasOwnProperty(x)){ 
     i++; 
    } 
    } 
    return i; 
} 


alert(objLength(JSONObject)); //returns 4 

Edit:

Javascript đã chuyển từ này ban đầu được viết tay, IE8 là đủ không liên quan mà bạn nên cảm thấy an toàn trong việc sử dụng Object.keys(JSONObject).length để thay thế. Sạch hơn nhiều.

+1

Điều đó sẽ chỉ trả về độ dài của các thuộc tính _enumerable_ của đối tượng _directly_ trên nó (không bao gồm các số đếm trên chuỗi nguyên mẫu). Điều này có thể được viết (trong JS hiện đại) là 'Object.keys (obj) .length' bằng cách này. –

+1

Hoặc xem xét ['Object.keys'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) (thuộc tính có thể đếm được) hoặc [' Object.getOwnPropertyNames' ] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames) (tất cả các thuộc tính) – user113215

+0

Đó là cực kỳ gọn gàng Benjamin, tôi thích nó. Nó đáng chú ý mặc dù nó không hoạt động trong IE8, vì vậy hiện tại không sử dụng được nếu không có shims. – Doug

3

Sau đây là thực sự là một mảng của các đối tượng JSON :

var JSONObject = [{ "name":"John Johnson", "street":"Oslo West 16", "age":33, 
"phone":"555 1234567"}, {"name":"John Johnson", "street":"Oslo West 16", 
"age":33, "phone":"555 1234567" }]; 

Vì vậy, trong chiều dài JavaScript là một tài sản của một mảng. Và trong trường hợp thứ hai của bạn, tức là

var JSONObject = {"name":"John Johnson", "street":"Oslo West 16", "age":33, 
"phone":"555 1234567"}; 

đối tượng JSON không phải là mảng. Vì vậy, thuộc tính độ dài không có sẵn và sẽ không được xác định. Vì vậy, bạn có thể biến nó thành một mảng như sau:

var JSONObject = [{"name":"John Johnson", "street":"Oslo West 16", "age":33, 
"phone":"555 1234567"}]; 

Hoặc nếu bạn đã có đối tượng nói JSONObject. Bạn có thể thử theo dõi:

var JSONObject = {"name":"John Johnson", "street":"Oslo West 16", "age":33, 
"phone":"555 1234567"}; 
var jsonObjArray = []; // = new Array(); 
jsonObjArray.push(JSONObject); 

Và bạn nhận được length tài sản.