nhận được mục cuối cùng trong một đối tượng javascript


93

Nếu tôi có một đối tượng như:

{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }

Nếu tôi không biết trước rằng danh sách đi lên 'c', ngoài việc lặp qua đối tượng, có cách nào để lấy mục cuối cùng trong đối tượng (ví dụ 'carrot') không?


Đó là một câu hỏi hay. Ngoài ra, làm cách nào để các đối tượng có thể được kiểm tra độ rỗng, ngoài việc lặp lại chúng?
Lukas Eder,

2
tài sản không phải "item". và không, thứ tự tài sản là không xác định.
Tư vấn Miễn phí vào

tài sản cuối cùng giá trị ông có nghĩa là, tôi sẽ nói
KooiInc

Câu trả lời:


64

Không. Thứ tự không được đảm bảo trong JSON và hầu hết các cấu trúc dữ liệu khóa-giá trị khác, do đó, mục cuối cùng đôi khi có thể là carrotvà vào những thời điểm khác banana, v.v. Nếu bạn cần dựa vào thứ tự, đặt cược tốt nhất của bạn là đi theo mảng. Sức mạnh của cấu trúc dữ liệu khóa-giá trị nằm ở việc truy cập các giá trị của chúng keys, chứ không phải ở việc có thể lấy được nthmục của đối tượng.


1
Như một sự mở rộng về câu trả lời hoàn toàn chính xác này. Các đối tượng không phải là mảng, ngay cả khi bạn tạo một mảng kết hợp trong JS bằng cách sử dụng các dấu mảng []thì nó thực sự là một đối tượng. JS không có các mảng liên kết như vậy, các mảng có quyền truy cập và trình tự được lập chỉ mục; các đối tượng có quyền truy cập thuộc tính liên kết, không tuần tự.
Chơi bạc vào

3
Tôi biết họ không được đảm bảo có một đơn đặt hàng, nhưng nếu tôi có quyền kiểm soát việc tạo ra đối tượng, về mặt thực tế, tôi có thể đảm bảo rằng chúng theo một thứ tự cụ thể. Rõ ràng, câu trả lời cho câu hỏi, mặc dù, là "không". :)
sprugman,

2
@sprugman: Không có trong Chrome. Một cuộc tranh luận sôi nổi đã nổ ra từ lâu về chủ đề này: code.google.com/p/v8/issues/detail?id=164
Tim Down vào

216

Có, có một cách sử dụng Object.keys(obj). Nó được giải thích trong trang này :

var fruitObject = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
Object.keys(fruitObject); // this returns all properties in an array ["a", "b", "c"]

Nếu bạn muốn lấy giá trị của đối tượng cuối cùng, bạn có thể làm như sau:

fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot"

8
Cái này đáng lẽ phải là cái được chấp nhận, nó Object.keyshoạt động tuyệt vời. Chỉ cần tìm cách làm cho nó hoạt động trên IE8 và 7, vì điều đó chỉ hiển thị trên IE9.
RaphaelDDL

4
bạn có thể thực hiện trực tiếp với Object.values ​​(fruitObject), nó sẽ trả về các giá trị thay vì các khóa và sau đó thực hiện một pop () vào mảng của bạn để trả về phần tử cuối cùng.
Yvon Huynh

4
Câu trả lời đầu tiên ở đây là câu trả lời chính xác. Tôi đã thử sử dụng Object.keysnhiều lần chỉ để thấy rằng các thuộc tính thực sự được sắp xếp ngẫu nhiên. Thứ tự thuộc tính thực tế khác với thứ tự được hiển thị khi đăng nhập vào bảng điều khiển trình duyệt của bạn. Khi đăng nhập vào bảng điều khiển của trình duyệt, các thuộc tính sẽ tự động được sắp xếp lại và hiển thị theo thứ tự bảng chữ cái / số, điều này chắc chắn gây ra một số nhầm lẫn.
kennsorr

1
Thông số JS không đảm bảo thứ tự của khóa và nó có thể thay đổi giữa các cách triển khai (công cụ) khác nhau. Do đó, không thể đảm bảo thứ tự chèn cho đối tượng được tạo ngẫu nhiên (có khóa). Mảng là một loại Đối tượng trong đó khóa là chỉ số số để đảm bảo thứ tự chèn giữa các thuộc tính hữu ích khác.
Ethan Doh

1
Những người tốt bụng đã gặp khó khăn khi phát triển web vào năm 2010-2013 ...
Merc

22
last = Object.keys(obj)[Object.keys(obj).length-1];

nơi obj là đối tượng của bạn


1
Điều này nhận được khóa cuối cùng ( 'c'trong trường hợp này) nhưng câu hỏi được diễn đạt theo cách ngụ ý người hỏi đang tìm kiếm giá trị cuối cùng ( 'carrot'). Điều này cũng không thực sự thêm bất cứ điều gì mà chưa được bao phủ bởi câu trả lời Kristina Stefanova của
bmaupin

13
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";

nguồn: http://javascriptweblog.wordpress.com


2
"ngoại trừ vòng qua đối tượng"
sprugman

2
Đối với những người cần phải nhận được chìa khóa đầu tiên của một đối tượng có thể làm theo cách trên nhưng với điều này:for (firstProperty in myObj) { break; };
panosru

10

Giải pháp sử dụng cú pháp gán cấu trúc của ES6:

var temp = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var { [Object.keys(temp).pop()]: lastItem } = temp;
console.info(lastItem); //"carrot"


5

Đối với thứ tự của các thuộc tính đối tượng trong Javascript, tôi sẽ chỉ liên kết đến câu trả lời này:

Thứ tự các phần tử trong vòng lặp "for (… in…)"

Đặc biệt:

Tất cả các triển khai hiện đại của ECMAScript đều lặp lại qua các thuộc tính đối tượng theo thứ tự mà chúng được xác định

Vì vậy, mọi câu trả lời khác ở đây đều đúng, không có lệnh chính thức được đảm bảo để phản đối tài sản. Tuy nhiên, trong thực tế thì có (loại bỏ bất kỳ lỗi nào mà tự nhiên có thể làm hỏng hành vi được chỉ định chính thức).

Hơn nữa, thứ tự liệt kê thực tế của các thuộc tính đối tượng có thể sẽ được mã hóa trong các thông số kỹ thuật EMCAScript trong tương lai.

Tuy nhiên, tại thời điểm này, tôi sẽ không viết mã xung quanh vấn đề này, chủ yếu là vì không có công cụ tích hợp nào để giúp xử lý thứ tự thuộc tính đối tượng. Bạn có thể viết của riêng bạn, nhưng cuối cùng bạn luôn phải lặp lại từng thuộc tính trong một đối tượng để xác định vị trí của nó.

Vì vậy câu trả lời cho câu hỏi của bạn là Không , không có cách nào khác ngoài việc lặp qua một đối tượng.


Như bạn nói, tôi chắc chắn sẽ không dựa vào bất kỳ thứ tự nào để liệt kê thuộc tính đối tượng. Đầu tiên, việc triển khai ECMAScript mới không có nghĩa vụ phải tuân theo tiêu chuẩn thực tế này, vì vậy mã dựa trên một đơn đặt hàng cụ thể không phải là bằng chứng trong tương lai; Ngoài ra, không phải tất cả các trình duyệt hiện tại đều hoạt động giống nhau. Xem cuộc thảo luận này trên trình theo dõi lỗi của Chrome: code.google.com/p/v8/issues/detail?id=164 . Cuối cùng, tôi sẽ không mong đợi thông số kỹ thuật ECMAScript sẽ sớm chuẩn hóa điều này.
Tim Down

5

Sử dụng một mảng, không phải một đối tượng theo nghĩa đen, nếu thứ tự quan trọng.

list = ['apple', 'banana', 'carrot'];

Hoặc một cái gì đó như

dict = {
 'a' : ['apple', 'awesome'],
 'b' : ['best friend']
};

Hoặc thậm chí ..

dict = [{letter:'a', list:['apple', 'awesome']},{letter:'b', list:['best friend']}];

Các chìa khóa cho hoàn toàn dictkhông được đảm bảo theo thứ tự.


5

Bạn có thể thử điều này. Điều này sẽ lưu trữ mục cuối cùng. Ở đây cần chuyển obj thành mảng. Sau đó, sử dụng pop()hàm mảng sẽ trả về mục cuối cùng từ mảng đã chuyển đổi.

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var last = Object.keys(obj).pop();
console.log(last);
console.log(obj[last]);


5

Các câu trả lời khác làm phức tạp nó cho tôi.

let animals = {
  a: 'dog',
  b: 'cat',
  c: 'bird'
}

let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]

3
JSArray = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };  
document.write(Object.keys(JSArray)[Object.keys(JSArray).length-1]);// writes 'c'   
document.write(JSArray[Object.keys(JSArray)[Object.keys(JSArray).length-1]]); // writes 'carrot'

1

Bạn cũng có thể sử dụng Object.values()phương pháp:

Object.values(fruitObject)[Object.values(fruitObject).length - 1]; // "carrot"

0

Đối tượng ánh xạ trong JavaScript . Bây giờ đã được khoảng 3 tuổi. Cấu trúc dữ liệu bản đồ này giữ lại thứ tự mà các mục được chèn vào. Với việc truy xuất mục cuối cùng này sẽ thực sự dẫn đến mục mới nhất được chèn vào Bản đồ



0

nếu bạn muốn lấy khóa cuối cùng theo thứ tự bảng chữ cái, bạn có thể (bảo đảm):

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var keys = Object.keys(obj);
keys.sort();
var lastkey = keys.pop() // c
var lastvalue = obj[lastkey] // 'carrot'
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.