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?
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?
Câu trả lời:
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à carrot
và 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 nth
mục của đối tượ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ự.
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"
Object.keys
hoạ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.
Object.keys
nhiề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.
last = Object.keys(obj)[Object.keys(obj).length-1];
nơi obj là đối tượng của bạn
'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
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";
for (firstProperty in myObj) { break; };
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"
Đố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.
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 dict
không được đảm bảo theo thứ tự.
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]);
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()]
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'
Đố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 đồ
Hãy obj
là đối tượng của bạn. Thực thi:
(_ => _[Object.keys(_).pop()])( obj )
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'