2010-03-12 49 views
5

Tôi có một chuỗi st được trả lại từ một dịch vụ web. Tôi chuyển đổi chuỗi thành một đối tượng, làm thế nào tôi có thể đếm số không. của mảng bên trong nó? (Đối với trường hợp này đó là)Các đối tượng jSon đếm

var st = "{[{"Name": "fake", "Address": "add"]},[{"Name": "fake", "Address": "add"}]}"; 
var json = eval(st); 

json.length luôn trở

Trả lời

17

@ coure06 Tôi đã thay đổi một chút JSON của bạn. Hy vọng đây sẽ là hữu ích

var persons = { 
    "person1" : { 
     "Name": "Adam", 
     "Address": "USA" 
    }, 
    "person2" : { 
     "Name": "Jamie", 
     "Address": "USA" 
    } 
}; 
var count = 0; 
//var count = persons.length;   // wont work 
for (property in persons)   // should return 2 
{ 
    if(persons.hasOwnProperty(property)) 
    { 
     count++; 
    } 
} 

Live example at jsfiddle

+1

nên sử dụng hasOwnProperty: 'for (var x trong người) if (persons.hasOwnProperty (x)) đếm ++; ' – vsync

-1
  1. Đó không phải là một biểu hiện JSON hợp lệ.
  2. Không có cách tích hợp để đếm "thành viên" của một đối tượng. Bạn có thể viết một, nhưng nó có vấn đề do tính chất squishy của ngôn ngữ.

chỉnh sửa — bây giờ mà tôi đã thực hiện nó đến tương lai, nó có thể sử dụng các API như Object.keys(), Object.getOwnPropertyNames()Object.getOwnPropertySymbols để có được một số tài sản trong một đối tượng:

var props = Object.getOwnPropertySymbols(someObject); 
var length = props.length; // number of properties 

Theo kinh nghiệm của tôi, thật hiếm khi tôi quan tâm đến số lượng các thuộc tính trong một đối tượng; thông thường, nếu bạn không biết một đối tượng là gì, bạn quan tâm đến các thuộc tính cụ thể (theo tên). Tuy nhiên không có gì sai khi sử dụng các API đó.

5

Tôi ngạc nhiên json.length đang trả lại bất kỳ điều gì; chuỗi JSON đó không hợp lệ. Các dấu ngoặc nhọn ngoài cùng ({}) biểu thị một đối tượng, phải chứa khóa và giá trị, nhưng nó chỉ chứa một giá trị (mảng, không có khóa).

Nếu bạn loại bỏ các dấu ngoặc nhọn, nó sẽ hoạt động chính xác. Bạn đã đặt chúng ở đó, có lẽ vì bạn đã nhìn thấy nó được thực hiện? Nếu vậy, bạn muốn dấu ngoặc đơn (()), không phải dấu ngoặc nhọn.

Lưu ý rằng việc sử dụng eval trên dây JSON là không an toàn, bạn muốn sử dụng một bộ giải mã JSON mà không sử dụng eval (như json2.js, trong đó sử dụng eval, nhưng chỉ sau khi rất cẩn thận đảm bảo nó an toàn để làm như vậy, sửa đổi nó nếu cần), để an toàn tối ưu. Các dấu ngoặc giúp, nhưng chúng không phải là một giải pháp hoàn chỉnh.

2

Dưới đây là các trick!

var jsonString = "{field1:'data1',field2:'data2',arrField1:['arrField1Content1','arrField1Content2']}"; 
var obj = eval('(' + jsonString + ')'); 

var objCount=0; 
for(_obj in obj) objCount++; 

alert(objCount); 
1

Hãy thử sử dụng này,

var persons = { 
    "person1" : { 
     "Name": "Adam", 
     "Address": "USA" 
    }, 
    "person2" : { 
     "Name": "Jamie", 
     "Address": "USA" 
    } 
}; 

Object.prototype.count = function() { 
    var that = this, 
     count = 0; 

    for(property in that) { 
     if(that.hasOwnProperty(property)) { 
      count++; 
     } 
    } 

    return count; 
}; 

alert(persons.count()); 

này có thể làm việc cho các đối tượng lồng nhau như

var persons = { 
    "person1" : { 
     "Name": "Adam", 
     "Address": "USA" 
    }, 
    "person2" : { 
     "Name": "Jamie", 
     "Address": "USA" , 
     "users": { 
      "person1" : { 
       "Name": "Adam", 
       "Address": "USA" 
      }, 
      "person2" : { 
       "Name": "Jamie", 
       "Address": "USA" 
      } 
     } 
    } 
}; 

alert(persons.person2.users.count()); 
+0

Thanh lịch, được thực hiện tốt! –

+0

Mở rộng đối tượng không phải là ý tưởng tốt nhất http://stackoverflow.com/a/6877100/179669 – Bakudan

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