2013-06-07 23 views
48

Tôi có một cái gì đó đối tượng như:javascript đếm số đối tượng trong đối tượng

Object {0=Object, 1=Object, 2=Object} // Output from console.log(obj.Data); 

Nhưng không có cách nào mà tôi có thể đếm số lượng các đối tượng trong đối tượng, sau đó cuối cùng đã có được giá trị thuộc tính từ các đối tượng phụ .

Tôi đã thử

console.log(obj.Data[0].length); // It does not work 

console.log(obj.Data.length); // It does not work 

Đây là một chút khó khăn đối với tôi. Hy vọng các bạn có thể giúp.

+0

bạn có thể xin vui lòng gửi đối tượng hoàn chỉnh? –

+1

Tại sao bạn sử dụng một đối tượng theo cách này? Có rất nhiều điều cần xem xét cho câu hỏi của bạn - bạn cần phải hiểu những thuộc tính nào, cái nào là số đếm, cách nguyên mẫu có thể thêm vào mớ hỗn độn ở đây, v.v. Tại sao không chỉ sử dụng một mảng? – Sacho

+0

Mặc dù q này được đánh dấu là trùng lặp, câu trả lời được chấp nhận ở đây hoạt động dễ dàng hơn đối với tôi rằng các giải pháp được đưa ra trong câu hỏi đầu tiên. –

Trả lời

80

Cách dễ nhất để thực hiện điều này, với hiệu suất tuyệt vời và khả năng tương thích với cả trình duyệt cũ và mới, bao gồm Lo-Dash hoặc Underscore trong trang của bạn.

Sau đó, bạn có thể sử dụng một trong hai _.size(object) hoặc _.keys(object).length

Đối obj.Data của bạn, bạn có thể kiểm tra điều này với:

console.log(_.size(obj.Data)); 

hay:

console.log(_.keys(obj.Data).length); 

Lo-Dash và gạch dưới đều tuyệt vời thư viện; bạn sẽ tìm thấy một trong hai rất hữu ích trong mã của bạn. (Chúng khá giống nhau; Lo-Dash là một phiên bản mới hơn với một số advantanges.)

Ngoài ra, bạn có thể bao gồm chức năng này trong mã của bạn, mà chỉ đơn giản lặp thông qua thuộc tính của đối tượng và đếm chúng:

function ObjectLength(object) { 
    var length = 0; 
    for(var key in object) { 
     if(object.hasOwnProperty(key)) { 
      ++length; 
     } 
    } 
    return length; 
}; 

Bạn có thể kiểm tra điều này với:

console.log(ObjectLength(obj.Data)); 

đang đó không phải là nhanh như nó có thể là trong các trình duyệt hiện đại, mặc dù. Đối với một phiên bản nhanh hơn nhiều trong các trình duyệt hiện đại và vẫn hoạt động trong những cái cũ, bạn có thể sử dụng:

function ObjectLength_Modern(object) { 
    return Object.keys(object).length; 
} 

function ObjectLength_Legacy(object) { 
    var length = 0; 
    for(var key in object) { 
     if(object.hasOwnProperty(key)) { 
      ++length; 
     } 
    } 
    return length; 
} 

var ObjectLength = 
    Object.keys ? ObjectLength_Modern : ObjectLength_Legacy; 

và như trước, thử nghiệm nó với:

console.log(ObjectLength(obj.Data)); 

Mã này sử dụng Object.keys(object).length trong các trình duyệt hiện đại và rơi trở lại để đếm trong một vòng lặp cho các trình duyệt cũ.

Nhưng nếu bạn làm tất cả công việc này, tôi khuyên bạn nên sử dụng Lo-Dash hoặc Underscore thay thế và nhận được tất cả những lợi ích mà các thư viện đó cung cấp.

Tôi thiết lập jsPerf that compares the speed of these various approaches. Hãy chạy nó trong bất kỳ trình duyệt nào bạn có thể thêm vào các bài kiểm tra.

Cảm ơn Barmar vì câu trả lời của anh ấy là suggesting Object.keys for newer browsers.

+0

Sử dụng toán tử có điều kiện để thực hiện loại phát hiện tính năng này có vẻ quá phức tạp. –

+0

Xin chào, bạn có thể giải thích về điều này không? Tôi có thể đặt điều này vào một chức năng và gọi bất cứ khi nào chúng ta cần nó? Để đề phòng an toàn cho người dùng sử dụng trình duyệt cũ hơn, tôi sẽ cố gắng áp dụng điều này. –

+1

Đó là một cách khá phổ biến để làm điều đó, nhưng công bằng, bạn có thể dễ dàng làm điều tương tự với một tuyên bố nếu. Điều chính là làm điều đó bên ngoài hàm thay vì bên trong hàm. –

41

Trong các trình duyệt gần đây bạn có thể sử dụng:

Object.keys(obj.Data).length 

Xem MDN

Đối với các trình duyệt cũ, sử dụng for-in vòng lặp trong câu trả lời Michael Geary của.

+0

Hi Barmar, bằng cách nào đó nó không đăng nhập dưới bàn điều khiển ... Bạn có thể giúp tôi bằng cách giải thích? –

+0

'keys' không phải là thuộc tính của đối tượng cần đếm. @BryanLearn: Anh ấy có nghĩa là 'Object.keys (obj.Data) .length'. Nên được đóng như một dupe anyway :-) – Bergi

+0

Với tôi đây là câu trả lời. Thêm một thư viện như lodash không phải là một phần của giải pháp. Ngoài ra, bạn không thể dựa vào một vòng lặp 'for in' để xuất ra theo thứ tự mong muốn. – BenRacicot

18

Hãy thử Demo Here

var list ={}; var count= Object.keys(list).length; 
+4

Bạn nên upvote câu trả lời khác thay vì đăng lại các giải pháp :-) – Bergi

+4

khi tôi bắt đầu làm demo, không ai đã đưa ra câu trả lời này. – Sudarshan