Hướng dẫn count object javascript - đếm đối tượng javascript

Bạn có thể sử dụng mã này:

if (!Object.keys) {
    Object.keys = function (obj) {
        var keys = [],
            k;
        for (k in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, k)) {
                keys.push(k);
            }
        }
        return keys;
    };
}

Sau đó, bạn cũng có thể sử dụng điều này trong các trình duyệt cũ hơn:

var len = Object.keys(obj).length;

Đã trả lời ngày 15 tháng 4 năm 2011 lúc 10:48Apr 15, 2011 at 10:48

Hướng dẫn count object javascript - đếm đối tượng javascript

Renaat de Muynckrenaat de MuynckRenaat De Muynck

3.1441 Huy hiệu vàng22 Huy hiệu bạc18 Huy hiệu đồng1 gold badge22 silver badges18 bronze badges

14

Nếu bạn đang sử dụng UnderCore.js, bạn có thể sử dụng _.size (cảm ơn douwe):

_.size(obj)

Ngoài ra, bạn cũng có thể sử dụng _ .Keys có thể rõ ràng hơn đối với một số người:

_.keys(obj).length

Tôi đánh giá cao nhấn mạnh.js. Đó là một thư viện chặt chẽ để làm nhiều việc cơ bản. Bất cứ khi nào có thể, họ khớp với Ecmascript & NBSP; 5 và trì hoãn việc triển khai bản địa.

Nếu không, tôi hỗ trợ câu trả lời của Avi Flax. Tôi đã chỉnh sửa nó để thêm một liên kết vào tài liệu MDC bao gồm phương thức khóa () bạn có thể thêm vào các trình duyệt không phải ECMAScript & NBSP; 5.

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 16 tháng 5 năm 2011 lúc 15:24May 16, 2011 at 15:24

Studgeekstudgeekstudgeek

13.6K6 Huy hiệu vàng83 Huy hiệu bạc95 Huy hiệu Đồng6 gold badges83 silver badges95 bronze badges

5

Việc thực hiện đối tượng tiêu chuẩn (ES5.1 Các thuộc tính và phương pháp nội bộ đối tượng) không yêu cầu

_.keys(obj).length
2 để theo dõi số lượng khóa/thuộc tính của nó, do đó không có cách nào để xác định kích thước của
_.keys(obj).length
2 mà không cần lặp lại một cách rõ ràng hoặc ngầm .

Vì vậy, đây là những lựa chọn thay thế được sử dụng phổ biến nhất:

1. Đối tượng của Ecmascript.Keys ()

_.keys(obj).length
4 hoạt động bằng cách lặp lại bên trong các phím để tính toán một mảng tạm thời và trả về độ dài của nó.

  • Ưu điểm - Syntax có thể đọc và sạch. Không yêu cầu thư viện hoặc mã tùy chỉnh ngoại trừ shim nếu không có sẵn - Readable and clean syntax. No library or custom code required except a shim if native support is unavailable
  • Nhược điểm - Bộ nhớ trên đầu do tạo ra mảng. - Memory overhead due to the creation of the array.

2. Các giải pháp dựa trên thư viện

Nhiều ví dụ dựa trên thư viện ở nơi khác trong chủ đề này là những thành ngữ hữu ích trong bối cảnh thư viện của họ. Tuy nhiên, từ quan điểm hiệu suất, không có gì để đạt được so với mã không có thư viện hoàn hảo vì tất cả các phương thức thư viện đó thực sự gói gọn một vòng lặp hoặc ES5

_.keys(obj).length
5 (gốc hoặc sáng).

3. Tối ưu hóa một vòng lặp for

Phần chậm nhất của vòng lặp như vậy nói chung là cuộc gọi

_.keys(obj).length
6, vì chi phí gọi chức năng. Vì vậy, khi tôi chỉ muốn số lượng mục của đối tượng JSON, tôi chỉ bỏ qua cuộc gọi
_.keys(obj).length
6 nếu tôi biết rằng không có mã nào cũng không mở rộng
_.keys(obj).length
8.slowest part of such a for-loop is generally the
_.keys(obj).length
6 call, because of the function call overhead. So when I just want the number of entries of a JSON object, I just skip the
_.keys(obj).length
6 call if I know that no code did nor will extend
_.keys(obj).length
8.

Mặt khác, mã của bạn có thể được tối ưu hóa rất một chút bằng cách tạo

_.keys(obj).length
9 cục bộ (
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
0) và bằng cách sử dụng toán tử increment tiền tố (
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
1) thay vì postfix.

var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;

Một ý tưởng khác phụ thuộc vào bộ nhớ đệm phương pháp

var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
2:

var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;

Cho dù điều này có nhanh hơn hay không trên một môi trường nhất định là một câu hỏi về điểm chuẩn. Tăng hiệu suất rất hạn chế có thể được dự kiến ​​dù sao.

3

Dưới đây là một số bài kiểm tra hiệu suất cho ba phương pháp;

https://jsperf.com/get-the-number-of-keys-in-an-object

Object.keys().length

20.735 hoạt động mỗi giây operations per second

Nó rất đơn giản và tương thích và chạy nhanh nhưng đắt tiền, bởi vì nó tạo ra một loạt các phím mới, sau đó bị vứt đi.

return Object.keys(objectToRead).length;

Vòng qua các phím

15.734 hoạt động mỗi giây operations per second

let size=0;
for(let k in objectToRead) {
  size++
}
return size;

Nó chậm hơn một chút, nhưng không nơi nào gần sử dụng bộ nhớ, vì vậy có lẽ tốt hơn nếu bạn quan tâm đến việc tối ưu hóa cho các máy di động hoặc các máy nhỏ khác.

Sử dụng bản đồ thay vì đối tượng

953.839.338 hoạt động mỗi giây operations per second

return mapToRead.size;

Về cơ bản, MAP theo dõi kích thước riêng của nó, vì vậy chúng tôi chỉ trả lại một trường số. Nó là xa, nhanh hơn nhiều so với bất kỳ phương pháp nào khác. Nếu bạn có quyền kiểm soát đối tượng, thay vào đó hãy chuyển đổi chúng thành bản đồ.

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 21 tháng 10 năm 2019 lúc 18:57Oct 21, 2019 at 18:57

Steve Coopersteve CooperSteve Cooper

Phim thương hiệu vàng 19.6K1414 gold badges71 silver badges88 bronze badges

1

Nếu bạn thực sự gặp phải một vấn đề về hiệu suất, tôi sẽ đề nghị gói các cuộc gọi thêm/xóa các thuộc tính vào/từ đối tượng với một hàm cũng tăng/giảm thuộc tính được đặt tên phù hợp (kích thước?).

Bạn chỉ cần tính toán số lượng thuộc tính ban đầu một lần và di chuyển từ đó. Nếu không có vấn đề về hiệu suất thực tế, đừng bận tâm. Chỉ cần bọc bit mã đó trong một hàm

var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
3 và được thực hiện với nó.

Đã trả lời ngày 24 tháng 9 năm 2008 lúc 9:11Sep 24, 2008 at 9:11

Nhầm lẫnConfusion

15.6K8 Huy hiệu vàng46 Huy hiệu bạc71 Huy hiệu đồng8 gold badges46 silver badges71 bronze badges

6

Như đã trả lời trong một câu trả lời trước:

var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
4

Nhưng: Như chúng ta có một lớp bản đồ thực sự trong ES6, tôi sẽ đề nghị sử dụng nó thay vì sử dụng các thuộc tính của một đối tượng.

const map = new Map();
map.set("key", "value");
map.size; // THE fastest way

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 19 tháng 1 năm 2018 lúc 9:04Jan 19, 2018 at 9:04

Flavien Volkenflavien VolkenFlavien Volken

17.3k11 Huy hiệu vàng91 Huy hiệu bạc119 Huy hiệu đồng11 gold badges91 silver badges119 bronze badges

2

Điều này hoạt động cho cả hai, mảng và đối tượng

var len = Object.keys(obj).length;
0

đếm đối tượng/mảng và cả độ dài của chuỗi

var len = Object.keys(obj).length;
1

Đã trả lời ngày 30 tháng 1 lúc 12:35Jan 30 at 12:35

Hướng dẫn count object javascript - đếm đối tượng javascript

DazzafactDazzafactdazzafact

2.1043 huy hiệu vàng27 Huy hiệu bạc44 Huy hiệu đồng3 gold badges27 silver badges44 bronze badges

Như đã nêu bởi Avi Flax,

var len = Object.keys(obj).length;
2

Sẽ thực hiện thủ thuật cho tất cả các thuộc tính có thể loại bỏ trên đối tượng của bạn, nhưng cũng bao gồm các thuộc tính không phải là động, thay vào đó bạn có thể sử dụng

var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
5. Đây là sự khác biệt:

var len = Object.keys(obj).length;
3

Như đã nêu ở đây, điều này có hỗ trợ trình duyệt giống như

_.keys(obj).length
5.

Tuy nhiên, trong hầu hết các trường hợp, bạn có thể không muốn đưa các loại hình không khác vào các loại hoạt động này, nhưng luôn luôn tốt để biết sự khác biệt;)

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 17 tháng 1 năm 2013 lúc 11:15Jan 17, 2013 at 11:15

1

Để lặp lại câu trả lời của Avi Flax, object.keys (obj) .length là chính xác cho một đối tượng không có chức năng gắn liền với nó.

Example:

var len = Object.keys(obj).length;
4

đấu với

var len = Object.keys(obj).length;
5

Các bước để tránh điều này:

  1. Không đặt các chức năng vào một đối tượng mà bạn muốn đếm số lượng khóa trong

  2. Sử dụng một đối tượng riêng biệt hoặc tạo một đối tượng mới cụ thể cho các chức năng (nếu bạn muốn đếm số lượng có trong tệp bằng cách sử dụng

    var count = 0;
    for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
    
    4)

Ngoài ra, vâng, tôi đã sử dụng mô -đun

var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
8 hoặc UnderCore.js từ Node.js trong ví dụ của tôi.

Tài liệu có thể được tìm thấy ở đây cũng như nguồn của nó trên GitHub và nhiều thông tin khác.

Và cuối cùng là một triển khai Lodash https://lodash.com/docs#size

var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
9

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 30 tháng 3 năm 2014 lúc 1:11Mar 30, 2014 at 1:11

BelldandubelldanduBelldandu

1.9561 Huy hiệu vàng14 Huy hiệu bạc16 Huy hiệu đồng1 gold badge14 silver badges16 bronze badges

3

Tôi không nhận thức được bất kỳ cách nào để làm điều này. Tuy nhiên, để giữ cho các lần lặp ở mức tối thiểu, bạn có thể thử kiểm tra sự tồn tại của

var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
0 và nếu nó không tồn tại (tức là, không phải Firefox) thì bạn có thể lặp lại đối tượng và xác định nó để sử dụng sau, ví dụ:

var len = Object.keys(obj).length;
6

Bằng cách này, bất kỳ trình duyệt nào hỗ trợ

var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
0 sẽ sử dụng nó và các lần lặp lại sẽ chỉ được thực hiện cho những người không. Nếu số đếm thay đổi và bạn không thể làm điều này, bạn luôn có thể biến nó thành một chức năng:

var len = Object.keys(obj).length;
7

Bằng cách này, bất cứ khi nào bạn tham khảo myobj .________ 50 Hàm sẽ bắn và tính toán lại.

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 24 tháng 9 năm 2008 lúc 9:13Sep 24, 2008 at 9:13

Luke Bennettluke BennettLuke Bennett

32.4K3 Huy hiệu vàng30 Huy hiệu bạc56 Huy hiệu đồng3 gold badges30 silver badges56 bronze badges

4

Từ object.defineProperty ():

Object.DefineProperty (OBJ, Prop, Descriptor)

Bạn có thể thêm nó vào tất cả các đối tượng của mình:

var len = Object.keys(obj).length;
8

Hoặc một đối tượng duy nhất:

var len = Object.keys(obj).length;
9

Example:

_.size(obj)
0

Đã thêm theo cách đó, nó sẽ không được hiển thị cho..in vòng lặp:

_.size(obj)
1

Output:

_.size(obj)
2

Lưu ý: Nó không hoạt động trong các trình duyệt trước Internet & nbsp; Explorer & nbsp; 9.

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 21 tháng 8 năm 2015 lúc 3:37Aug 21, 2015 at 3:37

Hướng dẫn count object javascript - đếm đối tượng javascript

Lepelepelepe

24K9 Huy hiệu vàng94 Huy hiệu bạc102 Huy hiệu Đồng9 gold badges94 silver badges102 bronze badges

1

Đối với những người có dấu gạch dưới được bao gồm trong dự án của họ, bạn có thể làm:

_.size(obj)
3

hoặc phong cách chức năng:

_.size(obj)
4

Đã trả lời ngày 4 tháng 1 năm 2012 lúc 9:04Jan 4, 2012 at 9:04

Hakuninhakuninhakunin

3.9316 huy hiệu vàng38 Huy hiệu bạc56 Huy hiệu đồng6 gold badges38 silver badges56 bronze badges

1

Làm thế nào tôi đã giải quyết vấn đề này là xây dựng việc triển khai một danh sách cơ bản của riêng tôi để ghi lại số lượng mục được lưu trữ trong đối tượng. Nó rất đơn giản. Một cái gì đó như thế này:

_.size(obj)
5

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 28 tháng 6 năm 2011 lúc 10:04Jun 28, 2011 at 10:04

AlialiAli

254K261 Huy hiệu vàng567 Huy hiệu bạc755 Huy hiệu đồng261 gold badges567 silver badges755 bronze badges

10

Đối với những người có ext & nbsp; js 4 trong dự án của họ, bạn có thể làm:

_.size(obj)
6

Ưu điểm của điều này là nó sẽ hoạt động trên tất cả các trình duyệt tương thích của ext & nbsp; Tuy nhiên, tôi tin rằng thời gian chạy không tốt hơn O (N), như với các giải pháp được đề xuất khác.

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 12 tháng 4 năm 2012 lúc 7:40Apr 12, 2012 at 7:40

Mark Rhodesmark RhodesMark Rhodes

9.8034 Huy hiệu vàng46 Huy hiệu bạc51 Huy hiệu Đồng4 gold badges46 silver badges51 bronze badges

Bạn có thể dùng:

_.size(obj)
7

_.size(obj)
8

Hướng dẫn count object javascript - đếm đối tượng javascript

Nino

6.6102 Huy hiệu vàng25 Huy hiệu bạc41 Huy hiệu Đồng2 gold badges25 silver badges41 bronze badges

Đã trả lời ngày 28 tháng 2 năm 2018 lúc 7:09Feb 28, 2018 at 7:09

FayazfayazFayaz

411 Huy hiệu bạc3 Huy hiệu đồng1 silver badge3 bronze badges

OP không chỉ định nếu đối tượng là một Nodelist. Nếu có, thì bạn chỉ có thể sử dụng phương thức độ dài trên nó trực tiếp. Thí dụ:length method on it directly. Example:

_.size(obj)
9

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 22 tháng 6 năm 2019 lúc 5:21Jun 22, 2019 at 5:21

Hướng dẫn count object javascript - đếm đối tượng javascript

Robert Sinclairrobert SinclairRobert Sinclair

3.9952 Huy hiệu vàng37 Huy hiệu bạc38 Huy hiệu đồng2 gold badges37 silver badges38 bronze badges

Nếu jQuery trong các câu trả lời trước không hoạt động, thì hãy thử

_.keys(obj).length
0

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 2 tháng 9 năm 2012 lúc 1:32Sep 2, 2012 at 1:32

3

Tôi không nghĩ điều này là có thể (ít nhất là không sử dụng một số bên trong). Và tôi không nghĩ bạn sẽ đạt được nhiều bằng cách tối ưu hóa điều này.

Đã trả lời ngày 24 tháng 9 năm 2008 lúc 9:05Sep 24, 2008 at 9:05

Amixamixamix

Huy hiệu Bạc 1311 Huy hiệu Đồng1 silver badge3 bronze badges

1

Tôi cố gắng làm cho nó có sẵn cho tất cả các đối tượng như thế này:

_.keys(obj).length
1

Hướng dẫn count object javascript - đếm đối tượng javascript

Đã trả lời ngày 14 tháng 4 năm 2018 lúc 12:51Apr 14, 2018 at 12:51

1