รับรายการสุดท้ายในวัตถุจาวาสคริปต์


96

หากฉันมีวัตถุเช่น:

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

ถ้าฉันไม่รู้ล่วงหน้าว่ารายการขึ้นไปที่ 'c' นอกเหนือจากการวนลูปผ่านวัตถุมีวิธีรับรายการสุดท้ายในวัตถุ (เช่น'carrot') หรือไม่?


นั่นเป็นคำถามที่ดี นอกจากนี้วัตถุจะตรวจสอบความว่างเปล่าได้อย่างไรนอกเหนือจากการวนซ้ำวัตถุเหล่านั้น
Lukas Eder

2
คุณสมบัติไม่ใช่ "รายการ" และไม่ไม่มีการกำหนดลำดับทรัพย์สิน
ให้คำปรึกษาฟรี

มูลค่าทรัพย์สินสุดท้ายที่เขาหมายถึงฉันจะบอกว่า
KooiInc

คำตอบ:


67

เลขที่สั่งซื้อจะไม่รับประกันใน JSON และมากที่สุดในโครงสร้างข้อมูลที่สำคัญที่มีมูลค่าอื่น ๆ ดังนั้นจึงรายการสุดท้ายที่บางครั้งอาจจะเป็นcarrotและในเวลาอื่น ๆ จะเป็นbananaและอื่น ๆ หากคุณจำเป็นต้องพึ่งพาการสั่งซื้อทางออกที่ดีที่สุดคือการใช้อาร์เรย์ พลังของโครงสร้างข้อมูลคีย์ - ค่าอยู่ที่การเข้าถึงค่าโดยพวกเขาkeysไม่สามารถรับnthไอเท็มของอ็อบเจ็กต์ได้


1
เพื่อเป็นการขยายคำตอบที่ถูกต้องทั้งหมดนี้ ออบเจ็กต์ไม่ใช่อาร์เรย์แม้ว่าคุณจะสร้างอาร์เรย์ที่เชื่อมโยงใน JS โดยใช้เครื่องหมายอาร์เรย์[]แต่ก็เป็นวัตถุจริงๆ JS ไม่มีอาร์เรย์ที่เชื่อมโยงเช่นนี้อาร์เรย์มีดัชนีการเข้าถึงและลำดับ อ็อบเจ็กต์มีการเข้าถึงคุณสมบัติที่เชื่อมโยงไม่ใช่ลำดับ
Orbling

3
ฉันรู้ว่าพวกเขาไม่รับประกันว่าจะมีออร์เดอร์ แต่ถ้าฉันมีอำนาจควบคุมการสร้างของอ็อบเจกต์ในทางปฏิบัติฉันมั่นใจได้ว่าพวกมันจะเรียงตามลำดับ เห็นได้ชัดว่าคำตอบสำหรับคำถามคือ "ไม่" :)
sprugman

2
@sprugman: ไม่ได้อยู่ใน Chrome มีการถกเถียงกันอย่างดุเดือดเป็นเวลานานเกี่ยวกับเรื่องนี้: code.google.com/p/v8/issues/detail?id=164
Tim Down

225

ใช่มีวิธีการใช้Object.keys(obj). มีคำอธิบายในหน้านี้ :

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

หากคุณต้องการรับค่าของวัตถุสุดท้ายคุณสามารถทำได้:

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

8
อันนี้ควรได้รับการยอมรับซึ่งใช้Object.keysงานได้ดี เพียงแค่ต้องหาวิธีที่จะทำให้มันทำงานบน IE8 และ 7 เพราะมันปรากฏบน IE9 เท่านั้น
RaphaelDDL

4
คุณสามารถทำได้โดยตรงกับ Object.values ​​(fruitObject) ซึ่งจะส่งคืนค่าแทนคีย์จากนั้นทำป๊อป () ไปยังอาร์เรย์ของคุณเพื่อส่งคืนองค์ประกอบสุดท้าย
Yvon Huynh

4
คำตอบแรกนี่คือคำตอบที่ถูกต้อง ฉันลองใช้Object.keysซ้ำแล้วซ้ำเล่าเพื่อพบว่าคุณสมบัติถูกสั่งแบบสุ่มจริงๆ ลำดับคุณสมบัติจริงแตกต่างจากที่แสดงเมื่อเข้าสู่คอนโซลเบราว์เซอร์ของคุณ เมื่อเข้าสู่คอนโซลเบราว์เซอร์คุณสมบัติจะถูกจัดเรียงใหม่โดยอัตโนมัติและแสดงตามตัวอักษร / ตัวเลขซึ่งทำให้เกิดความสับสนอย่างแน่นอน
kennsorr

1
ข้อมูลจำเพาะ JS ไม่รับประกันลำดับของคีย์และอาจแตกต่างกันไประหว่างการนำไปใช้งาน (เอ็นจิ้น) ต่างๆ ดังนั้นจึงไม่สามารถรับประกันลำดับการแทรกสำหรับวัตถุ (คีย์) ที่สร้างขึ้นแบบสุ่ม Array เป็นวัตถุประเภทหนึ่งที่คีย์เป็นดัชนีตัวเลขเพื่อรับประกันลำดับการแทรกระหว่างคุณสมบัติที่มีประโยชน์อื่น ๆ
Ethan Doh

1
ท่านลอร์ดที่ดีมีช่วงเวลาที่ยากลำบากในการพัฒนาเว็บในปี 2010-2013 ...
Merc

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

โดยที่ obj เป็นวัตถุของคุณ


1
สิ่งนี้ได้รับคีย์สุดท้าย ( 'c'ในกรณีนี้) แต่คำถามถูกใช้ในลักษณะที่แสดงว่าผู้ถามกำลังมองหาค่าสุดท้าย ( 'carrot') นอกจากนี้ยังไม่ได้เพิ่มสิ่งที่ยังไม่ได้ครอบคลุมคำตอบของ Kristina Stefanova อีกด้วย
bmaupin

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

แหล่งที่มา: http://javascriptweblog.wordpress.com


2
"นอกเหนือจากการวนลูปผ่านวัตถุ"
sprugman

3
สำหรับผู้ที่ต้องการรับคีย์แรกของวัตถุสามารถทำตามวิธีข้างต้น แต่ด้วยสิ่งนี้:for (firstProperty in myObj) { break; };
panosru

10

วิธีแก้ไขโดยใช้ไวยากรณ์การกำหนดการทำลายของ ES6:

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


6

คุณสามารถลองสิ่งนี้ สิ่งนี้จะจัดเก็บรายการสุดท้าย ที่นี่ต้องแปลง obj เป็นอาร์เรย์ จากนั้นใช้pop()ฟังก์ชันอาร์เรย์ที่จะส่งคืนรายการสุดท้ายจากอาร์เรย์ที่แปลงแล้ว

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


5

สำหรับการจัดลำดับคุณสมบัติของวัตถุใน Javascript ฉันจะเชื่อมโยงไปยังคำตอบนี้:

เรียงลำดับองค์ประกอบในลูป "for (… in …)"

โดยเฉพาะ:

การนำ ECMAScript ไปใช้งานสมัยใหม่ทั้งหมดจะวนซ้ำผ่านคุณสมบัติของอ็อบเจ็กต์ตามลำดับที่กำหนดไว้

ดังนั้นคำตอบอื่น ๆ ที่นี่จึงถูกต้องไม่มีคำสั่งรับรองอย่างเป็นทางการในการคัดค้านคุณสมบัติ อย่างไรก็ตามในทางปฏิบัติมี (ยกเว้นข้อบกพร่องใด ๆ ที่สามารถทำให้พฤติกรรมที่ระบุไว้อย่างเป็นทางการได้แม้กระทั่งการตั้งค่าในหิน)

นอกจากนี้ลำดับการแจงนับโดยพฤตินัยของคุณสมบัติออบเจ็กต์ยังมีแนวโน้มที่จะถูกเข้ารหัสในข้อกำหนด EMCAScript ในอนาคต

ถึงกระนั้นในเวลานี้ฉันจะไม่เขียนโค้ดในส่วนนี้ส่วนใหญ่เป็นเพราะไม่มีเครื่องมือในตัวที่จะช่วยจัดการกับลำดับคุณสมบัติของอ็อบเจ็กต์ คุณสามารถเขียนของคุณเองได้ แต่สุดท้ายแล้วคุณจะวนซ้ำคุณสมบัติแต่ละรายการในวัตถุเพื่อกำหนดตำแหน่งของมัน

ดังนั้นคำตอบสำหรับคำถามของคุณคือไม่ไม่มีทางอื่นนอกจากการวนซ้ำวัตถุ


อย่างที่คุณพูดฉันจะไม่พึ่งพาคำสั่งใด ๆ สำหรับการแจงนับคุณสมบัติออบเจ็กต์อย่างแน่นอน สำหรับการเริ่มต้นการติดตั้ง ECMAScript ใหม่ไม่มีภาระผูกพันที่จะต้องปฏิบัติตามมาตรฐานพฤตินัยนี้ดังนั้นโค้ดที่อาศัยคำสั่งเฉพาะจึงไม่สามารถพิสูจน์ได้ในอนาคต นอกจากนี้เบราว์เซอร์ในปัจจุบันบางประเภทอาจไม่ทำงานเหมือนกัน ดูการสนทนานี้บนบั๊ก Chrome: code.google.com/p/v8/issues/detail?id=164 สุดท้ายฉันคงไม่คาดหวังว่าข้อกำหนด ECMAScript จะเป็นมาตรฐานในเร็ว ๆ นี้
Tim Down

5

ใช้อาร์เรย์ไม่ใช่อ็อบเจ็กต์ลิเทอรัลหากลำดับมีความสำคัญ

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

หรือสิ่งที่ชอบ

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

หรือแม้กระทั่ง..

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

dictไม่รับประกันว่าคีย์สำหรับจะเป็นไปตามลำดับ


5

คำตอบอื่น ๆ มีความซับซ้อนสำหรับฉัน

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

คุณยังสามารถใช้Object.values()วิธีการ:

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

0

แผนที่วัตถุใน JavaScript ตอนนี้ก็ประมาณ 3 ขวบแล้ว โครงสร้างข้อมูลแผนที่นี้ยังคงรักษาลำดับในการแทรกรายการ ด้วยการดึงรายการสุดท้ายนี้จะส่งผลให้มีการแทรกรายการล่าสุดในแผนที่



0

หากคุณหมายถึงรับคีย์สุดท้ายตามตัวอักษรคุณสามารถ (รับประกัน):

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'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.