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;
5Mộ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;
9Cho 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]
0Vòng qua các phím
15.734 hoạt động mỗi giây operations per second operations per second
_.size[obj]
1Nó 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]
2Về 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;
54Như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;
2Sẽ 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;
3Như đã 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;
5Các bước để tránh điều này:
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
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
54]var len = Object.keys[obj].length;
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;
6Bằ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;
7Bằ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;
8Hoặc một đối tượng duy nhất:
var len = Object.keys[obj].length;
9Example:
_.size[obj]
0Đã thêm theo cách đó, nó sẽ không được hiển thị cho..in vòng lặp:
_.size[obj]
1Output:
_.size[obj]
2Lư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]
3hoặ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]
7và
_.size[obj]
8Nino
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