Lấy danh sách các khóa mảng kết hợp


258

Tôi có một mảng kết hợp trong Javascript:

var dictionary = {
    "cats": [1,2,3,4,5], 
    "dogs": [6,7,8,9,10]
};

Làm cách nào để lấy khóa từ điển này? tức là tôi muốn

var keys = ["cats", "dogs"];

Chỉnh sửa 7 năm sau: Chỉ để có được thuật ngữ chính xác - không có thứ gọi là 'mảng kết hợp' trong Javascript - về mặt kỹ thuật đây chỉ là một object và đó là khóa đối tượng chúng ta muốn.


Cách đơn giản với lodash JS - lodash.com/docs#keys
Lập trình viên hóa học

Cảm ơn đã làm rõ thuật ngữ! Bạn có thể làm cho nó lớn hơn một chút trong ánh sáng nhấp nháy màu đỏ không?
Joe Phillips

@Joe Tôi sẽ biến nó thành kết quả đầu tiên trong google cho bạn khi tôi có cơ hội
Simon_Weaver

Câu trả lời:


84

Bạn có thể dùng: Object.keys(obj)

Thí dụ:

var dictionary = {
  "cats": [1, 2, 37, 38, 40, 32, 33, 35, 39, 36],
  "dogs": [4, 5, 6, 3, 2]
};

// Get the keys
var keys = Object.keys(dictionary);

console.log(keys);

Xem tài liệu tham khảo dưới đây để được hỗ trợ trình duyệt. Nó được hỗ trợ trong Firefox 4.20, Chrome 5, IE9. Liên kết dưới đây chứa một đoạn mã mà bạn có thể thêm nếu Object.keys()không được hỗ trợ trong trình duyệt của bạn.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys


Tôi đang chuyển câu trả lời này sang câu trả lời được chấp nhận ngay bây giờ. Chỉ IE8 không hỗ trợ nó nữa (mà polyfill có sẵn cho nhà phát triển.mozilla.org/en-US/docs/Web/JavaScript/Reference/iêu )
Simon_Weaver

382

Thử cái này:

var keys = [];
for (var key in dictionary) {
  if (dictionary.hasOwnProperty(key)) {
    keys.push(key);
  }
}

hasOwnPropertylà cần thiết bởi vì nó có thể chèn các khóa vào đối tượng nguyên mẫu của dictionary. Nhưng bạn thường không muốn những khóa đó có trong danh sách của bạn.

Ví dụ: nếu bạn làm điều này:

Object.prototype.c = 3;
var dictionary = {a: 1, b: 2};

và sau đó làm một for...invòng lặp trên dictionary, bạn sẽ nhận được ab, nhưng bạn cũng sẽ nhận được c.


Không cần khai báo "var Keys = []", trừ khi bạn cần sử dụng nó sau vòng lặp.
mzalazar

2
@mzalazar, bạn tốt hơn nên làm hoặc đó sẽ là một biến toàn cầu, đó là một thực tiễn xấu.
b00t

@ b00t tôi mặc dù bằng cách khai báo một biến trong vòng lặp for ... nó sẽ không được đặt trong không gian toàn cầu ... bây giờ bạn làm tôi nghi ngờ hehe :)
mzalazar

2
@mzalazar, nhưng bạn không khai báo ( khóa ) tại bất kỳ thời điểm nào nếu bạn chỉ đang sử dụng keys.push(key);. Bạn chỉ cần kéo (và do đó khai báo nó) từ không gian tên toàn cầu. :)
b00t

183
for (var key in dictionary) {
  // do something with key
}

Đó là tuyên bố for..in .


1
Chỉ cần lưu ý rằng nên có một dấu hai chấm thay vì dấu phẩy giữa "chó" và mảng ở trên. Giả sử đó là do phiên âm.
wombleton

68
Rất quan trọng để kiểm tra dictionary.hasOwnProperty(key)nếu không bạn có thể kết thúc bằng các phương pháp từ chuỗi nguyên mẫu ..
Tigraine

4
Từ cùng một bài viết: Lặp lại các thuộc tính vô số của một đối tượng, theo thứ tự tùy ý . Nếu thứ tự khóa là quan trọng, bạn cần thực hiện một số thứ như đẩy chúng vào một mảng, sắp xếp nó và sau đó sử dụng vòng lặp for () để lấy các khóa từ mảng được sắp xếp để lập chỉ mục cho đối tượng ban đầu.
mcmlxxxvi

1
Tất nhiên, đó là công bằng để tối ưu hóa bằng cách bỏ qua từ điển.hasOwnProperty kiểm tra nếu bạn có thể tự tin rằng đối tượng thiếu một nguyên mẫu. Nhưng điều quan trọng là phải nhận thức được khả năng kế thừa nguyên mẫu trong bối cảnh này, vì từ điển JavaScript thực sự là đối tượng.
fixermark

16

Chỉ cần lưu ý nhanh, hãy cảnh giác khi sử dụng for..in nếu bạn sử dụng thư viện (jQuery, nguyên mẫu, v.v.), vì hầu hết chúng đều thêm phương thức vào các Đối tượng được tạo (bao gồm cả từ điển).

Điều này có nghĩa là khi bạn lặp qua chúng, tên phương thức sẽ xuất hiện dưới dạng các khóa. Nếu bạn đang sử dụng một thư viện, hãy xem tài liệu và tìm một phần có thể đếm được, nơi bạn sẽ tìm thấy các phương thức phù hợp để lặp lại các đối tượng của mình.


3

Cách JQUERY đơn giản.

Đây là những gì tôi sử dụng
DictionaryObj là đối tượng từ điển javascript mà bạn muốn đi qua. giá trị, khóa học là tên của chúng trong từ điển.

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });

1
điều này đòi hỏi jQuery (vẫn ổn) nhưng bạn đã quên đề cập đến nó :-)
Simon_Weaver

@Exzile Các tên đối số trong định nghĩa hàm của bạn rất khó hiểu. Nó nói tại api.jquery.com/jquery.each rằng cuộc gọi lại là Hàm (String propertyName, Object valueOfProperty). Tên của bạn ngụ ý ngược lại.
Chris

@Chris Tôi sẽ cập nhật cho bạn. Cảm ơn đã chỉ ra rằng.
Exzile

0

Tôi hiện đang sử dụng trả lời của Rob de la Cruz

Object.keys(obj)

và trong một tệp được tải sớm, tôi có một số dòng mã được mượn từ nơi khác trên internet bao gồm trường hợp phiên bản cũ của trình thông dịch kịch bản không có Object.keys được tích hợp.

if (!Object.keys) {
    Object.keys = function(object) {
        var keys = [];
        for (var o in object) {
            if (object.hasOwnProperty(o)) {
                keys.push(o);
            }
        }
        return keys;
    };
}

Tôi nghĩ rằng đây là điều tốt nhất của cả hai thế giới cho các dự án lớn: mã hiện đại đơn giản và hỗ trợ tương thích ngược cho các phiên bản cũ của trình duyệt, v.v.

Thực tế, nó đưa giải pháp của JW vào chức năng khi Object.keys (obj) của Rob de la Cruz không có sẵn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.