Hướng dẫn get object count javascript - lấy số lượng đố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:48Apr 15, 2011 at 10:48

Renaat de Muynckrenaat 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 badges1 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.

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

Studgeekstudgeekstudgeekstudgeek

13.6K6 Huy hiệu vàng83 Huy hiệu bạc95 Huy hiệu Đồng6 gold badges83 silver badges95 bronze badges6 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 - 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. - 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.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 len = Object.keys[obj].length;
50] và bằng cách sử dụng toán tử increment tiền tố [
var len = Object.keys[obj].length;
51] thay vì postfix.
var len = Object.keys[obj].length;
5

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

var len = Object.keys[obj].length;
52:
var len = Object.keys[obj].length;
9

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;

//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 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.

_.size[obj]
0

Vòng qua các phím

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

_.size[obj]
1

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 operations per second

_.size[obj]
2

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 đồ.

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

Steve Coopersteve CooperSteve CooperSteve Cooper

Phim thương hiệu vàng 19.6K1414 gold badges71 silver badges88 bronze badges14 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 len = Object.keys[obj].length;
53 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:11Sep 24, 2008 at 9:11

Nhầm lẫnConfusionConfusion

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

6

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

var len = Object.keys[obj].length;
54

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.

_.size[obj]
5

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

Flavien Volkenflavien VolkenFlavien VolkenFlavien Volken

17.3k11 Huy hiệu vàng91 Huy hiệu bạc119 Huy hiệu đồng11 gold badges91 silver badges119 bronze badges11 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:35Jan 30 at 12:35

DazzafactDazzafactdazzafactdazzafact

2.1043 huy hiệu vàng27 Huy hiệu bạc44 Huy hiệu đồng3 gold badges27 silver badges44 bronze badges3 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 len = Object.keys[obj].length;
55. Đâ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;]

Đã trả lời ngày 17 tháng 1 năm 2013 lúc 11:15Jan 17, 2013 at 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 len = Object.keys[obj].length;
    
    54]

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

var len = Object.keys[obj].length;
5 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 //lodash.com/docs#size

var len = Object.keys[obj].length;
59

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

BelldandubelldanduBelldanduBelldandu

1.9561 Huy hiệu vàng14 Huy hiệu bạc16 Huy hiệu đồng1 gold badge14 silver badges16 bronze badges1 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 len = Object.keys[obj].length;
90 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 len = Object.keys[obj].length;
90 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.

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

Luke Bennettluke BennettLuke BennettLuke Bennett

32.4K3 Huy hiệu vàng30 Huy hiệu bạc56 Huy hiệu đồng3 gold badges30 silver badges56 bronze badges3 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.

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

Lepelepelepelepe

24K9 Huy hiệu vàng94 Huy hiệu bạc102 Huy hiệu Đồng9 gold badges94 silver badges102 bronze badges9 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:04Jan 4, 2012 at 9:04

Hakuninhakuninhakuninhakunin

3.9316 huy hiệu vàng38 Huy hiệu bạc56 Huy hiệu đồng6 gold badges38 silver badges56 bronze badges6 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

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

AlialiAliAli

254K261 Huy hiệu vàng567 Huy hiệu bạc755 Huy hiệu đồng261 gold badges567 silver badges755 bronze badges261 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.

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

Mark Rhodesmark RhodesMark RhodesMark Rhodes

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

Bạn có thể dùng:

_.size[obj]
7

_.size[obj]
8

Nino

6.6102 Huy hiệu vàng25 Huy hiệu bạc41 Huy hiệu Đồng2 gold badges25 silver badges41 bronze badges2 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:09Feb 28, 2018 at 7:09

FayazfayazFayazFayaz

411 Huy hiệu bạc3 Huy hiệu đồng1 silver badge3 bronze badges1 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:length method on it directly. Example:

_.size[obj]
9

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

Robert Sinclairrobert SinclairRobert SinclairRobert Sinclair

3.9952 Huy hiệu vàng37 Huy hiệu bạc38 Huy hiệu đồng2 gold badges37 silver badges38 bronze badges2 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

Đã trả lời ngày 2 tháng 9 năm 2012 lúc 1:32Sep 2, 2012 at 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:05Sep 24, 2008 at 9:05

Amixamixamixamix

Huy hiệu Bạc 1311 Huy hiệu Đồng1 silver badge3 bronze badges1 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

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

1

Chủ Đề