2008-10-07 28 views
35

Tôi chỉ cần lấy mục đầu tiên (thực ra, chỉ là khóa đầu tiên) ra khỏi một mảng kết hợp khá lớn trong JavaScript. Đây là cách tôi đang thực hiện nó (sử dụng jQuery):Cách hiệu quả nhất để lấy mục đầu tiên từ một mảng kết hợp trong JavaScript là gì?

getKey = function (data) { 
    var firstKey; 
    $.each(data, function (key, val) { 
     firstKey = key; 
     return false; 
    }); 
    return firstKey; 
}; 

Chỉ cần đoán, nhưng tôi muốn nói rằng phải có cách tốt hơn (đọc: hiệu quả hơn) để làm điều này. Bất kỳ đề xuất?

CẬP NHẬT: Cảm ơn câu trả lời và nhận xét sâu sắc! Tôi đã quên JavaScript 101 của tôi, trong đó spec nói rằng bạn không được bảo đảm một thứ tự cụ thể trong một mảng kết hợp. Tuy nhiên, điều thú vị là hầu hết các trình duyệt đều thực hiện theo cách đó. Tôi không muốn sắp xếp mảng trước khi nhận được khóa đầu tiên đó, nhưng nó có thể là không thể tránh khỏi cho trường hợp sử dụng của tôi.

+0

Nếu đó là mảng liên kết, bạn biết mục đầu tiên là gì? –

+0

Tôi nghĩ rằng anh ấy có nghĩa là mục đầu tiên được chèn vào mảng. –

+0

Nếu bạn muốn điều đó, bạn sẽ cần phải xây dựng triển khai Stack của riêng bạn. Các mảng Assoc không giữ lại bất kỳ thứ tự khóa nào. –

Trả lời

41

Không thực sự là đầu tiên hoặc yếu tố cuối cùng trong mảng kết hợp (tức là đối tượng). Thứ tự duy nhất bạn có thể hy vọng có được là thứ tự các phần tử đã được trình phân tích cú pháp lưu trữ - và không đảm bảo tính nhất quán với điều đó.

Nhưng, nếu bạn muốn là người đầu tiên đưa ra, cách thức cổ điển thực sự có thể là một chút dễ dàng hơn:

function getKey(data) { 
    for (var prop in data) 
    return prop; 
} 

Muốn tránh thuộc tính thừa kế?

function getKey(data) { 
    for (var prop in data) 
    if (data.propertyIsEnumerable(prop)) 
     return prop; 
} 
+7

Thực ra bạn được đảm bảo trật tự - không phải bởi thông số kỹ thuật, mà đơn giản là nhờ vào quá nhiều trang web tùy thuộc vào thứ tự trong quá khứ. Về cơ bản, bạn được đảm bảo rằng cho (a in b) .. sẽ bao gồm mỗi thuộc tính enumerable trong b theo thứ tự chính xác mà chúng đã được thêm vào đối tượng trong thời gian chạy. – olliej

+2

(Tôi hết dung lượng trên) Ngoại lệ cho việc này là thứ tự bạn liệt kê các thuộc tính trong chuỗi nguyên mẫu mà vẫn khác nhau từ trình duyệt đến trình duyệt – olliej

+4

Có gì sai với 'Object.keys (data) [0]'? – cprn

2

Ngoài giải pháp của Jonathan, chúng tôi cũng có thể mở rộng chức năng mảng mặc định:

Array.prototype.getKey = function() { 
    for (var prop in this) 
    if (this.propertyIsEnumerable(prop)) 
     return prop; 
} 
41

Bạn có thể tránh được việc phải tạo một hàm bằng cách tham khảo mục đầu tiên trở về từ Object.keys():

var firstKey = Object.keys(data)[0]; 

Đối với mục nhập đầu tiên từ danh sách khóa được sắp xếp, chỉ cần thêm một cuộc gọi vào phương thức .sort():

var firstKey = Object.keys(data).sort()[0]; 
+1

đây là cách tốt nhất tôi nghĩ ... +1! – Riad

+4

Nếu bạn cần hỗ trợ cho các trình duyệt cũ hơn, hãy đảm bảo bao gồm polyfill này trong tập lệnh của bạn: https: //developer.mozilla.org/en-US/tài liệu/Web/JavaScript/Tham chiếu/Global_Objects/Object/keys – 10basetom

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