2012-01-06 39 views
242

Tôi muốn lấy các khóa của đối tượng JavaScript làm mảng, trong jQuery hoặc JavaScript thuần túy.Lấy mảng khóa của đối tượng

Có cách nào tiết kiệm hơn không?

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' }; 
var keys = []; 
for (var key in foo) { 
    keys.push(key); 
} 
+4

Ngoài việc thêm 'if (foo.hasOwnProperty (key))', đó là những gì tôi muốn làm. Hoặc, sử dụng '$ .map'. –

+7

Oh cho một lớp lót Pythonic, mặc dù ... – Richard

+0

một câu hỏi cũ vì vậy không có giá trị một câu trả lời đầy đủ, nhưng đối với những người muốn fiddle ... http://jsfiddle.net/LR5D9/3/ giải pháp này đề với vấn đề của các tuyên bố nguyên mẫu rối tung lên 'cho var trong x' vòng – unsynchronized

Trả lời

435
var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' }; 
var keys = Object.keys(foo); // ['alpha', 'beta'] 
// (or maybe some other order, keys are unordered). 

Sử dụng Object.keys.

Đây là tính năng ES5. Điều này có nghĩa là nó hoạt động trong tất cả các trình duyệt hiện đại nhưng will not work in legacy browsers.

Các ES5-shim có implementation of Object.keys you can steal

+5

Lưu ý: Tính năng này chỉ hoạt động trên các trình duyệt hiện đại (do đó tôi không phải là IE <9). –

+2

Còn trình duyệt di động thì sao? –

+1

@SmartyTwiti: Tôi không chắc chắn. Tôi cho rằng nó giống như Chrome hoặc Firefox. –

51

Bạn có thể sử dụng jQuery $.map.

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' }, 
keys = $.map(foo, function(v, i){ 
    return i; 
}); 
+2

Giải pháp này (Rocket's) hoạt động tốt http://jsfiddle.net/KV3RA/3/ – MilkyWayJoe

+2

Dường như với tôi giải pháp này là tốt hơn nhiều nếu Object.keys() không hoạt động trong IE8 ... – NLemay

5

Tôi không biết về ít tiết nhưng tôi đã cảm hứng để ép buộc sau vào một dòng bằng cách yêu cầu một lót, không biết làm thế nào Pythonic nó là mặc dù ;)

var keys = (function(o){var ks=[]; for(var k in o) ks.push(k); return ks})(foo); 
+3

Có lẽ điều đó nên là 'var enumerableKeysOnThePrototypeChain';) – alex

+1

Có lẽ chúng ta đủ thông minh để biết chúng ta không phải lo lắng về hasOwnProperty nếu đối tượng được tạo hoàn toàn dưới chế độ xem của chúng ta trái ngược với được nhập từ một nơi khác –

+0

không như pythonic như câu trả lời thứ hai của @ alex ('for (keys [i ++] in foo) {}'), bởi vì bạn vẫn đang thực hiện 'Array.push()' (chưa kể đến việc khai báo toàn bộ hàm). Việc thực hiện pythonic nên dựa nhiều vào hiểu ngầm tiềm ẩn nhất có thể, và thất bại, bằng cách sử dụng một biểu thức lambda. – cowbert

22

Tất nhiên, Object.keys() là cách tốt nhất để có được chìa khóa của một đối tượng. Nếu không có sẵn trong môi trường của bạn, có thể là trivially sử dụng mã như trong ví dụ của bạn (ngoại trừ bạn cần phải tính đến vòng lặp của bạn sẽ lặp qua tất cả các thuộc tính trong chuỗi nguyên mẫu, không giống như hành vi của Object.keys()) .

Tuy nhiên, mã ví dụ của bạn ...

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' }; 
var keys = []; 
for (var key in foo) { 
    keys.push(key); 
} 

jsFiddle.

... có thể được sửa đổi. Bạn có thể thực hiện quyền chuyển nhượng trong phần biến số.

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' }; 
var keys = [], i = 0; 
for (keys[i++] in foo) {} 

jsFiddle.

Tất nhiên, hành vi này khác với những gì Object.keys() thực sự làm (jsFiddle). Bạn chỉ cần sử dụng shim on the MDN documentation.

+7

Tôi thích 'var keys = [], i = 0; cho (các phím [i + +] trong foo) {} '+1 – Jashwant

+0

Tôi nghe nói rằng" cho trong "không đảm bảo trật tự, bạn có biết nếu Object.keys không? –

+0

@ChrisStephens Không đảm bảo trật tự, ngay cả khi các phím kết thúc trong một mảng được sắp xếp. – alex

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