जावास्क्रिप्ट वस्तु में अंतिम वस्तु प्राप्त करना


93

अगर मेरे पास कोई वस्तु है जैसे:

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

अगर मुझे पहले से पता नहीं है कि सूची ऑब्जेक्ट के माध्यम से लूपिंग के अलावा 'सी' तक जाती है, तो क्या ऑब्जेक्ट में अंतिम आइटम प्राप्त करने का एक तरीका है (जैसे 'carrot')?


यह एक अच्छा सवाल है। इसके अलावा, वस्तुओं को उनके ऊपर लूपिंग के अलावा, खालीपन के लिए कैसे जांचा जा सकता है?
लुकास ईडर

2
संपत्ति "आइटम" नहीं। और नहीं, संपत्ति आदेश अपरिभाषित है।
नि: शुल्क परामर्श

अंतिम संपत्ति मूल्य का मतलब है, मैं कहूंगा
KooiInc

जवाबों:


64

JSON और अधिकांश अन्य महत्वपूर्ण-मूल्य डेटा संरचनाओं में ऑर्डर की गारंटी नहीं है, इसलिए अंतिम आइटम कभी-कभी carrotऔर अन्य समय पर हो सकता है banana। यदि आपको ऑर्डर करने पर भरोसा करने की आवश्यकता है, तो आपका सबसे अच्छा शर्त एरे के साथ जाना है। कुंजी-मूल्य डेटा संरचनाओं की शक्ति उनके द्वारा मूल्यों तक पहुँचने में निहित है keys, nthवस्तु की वस्तु प्राप्त करने में सक्षम नहीं होने में ।


1
इस पर एक विस्तार के रूप में पूरी तरह से सही जवाब। ऑब्जेक्ट एरे नहीं हैं, भले ही आप जेएस में एक ऐरेसेटिव ऐरे बनाते हों एरे मार्कर का उपयोग करके []यह वास्तव में एक ऑब्जेक्ट है। जेएस के पास सहयोगी सरणियां नहीं हैं जैसे, सरणियों ने अनुक्रमित पहुंच और अनुक्रम किया है; वस्तुओं में साहचर्य संपत्ति का उपयोग, गैर-अनुक्रमिक है।
परिक्रमा

3
मुझे पता है कि उन्हें आदेश देने की गारंटी नहीं है, लेकिन अगर व्यावहारिक रूप से, वस्तु के निर्माण पर मेरा नियंत्रण है, तो मैं यह सुनिश्चित कर सकता हूं कि वे एक विशिष्ट क्रम में हैं। स्पष्ट रूप से, प्रश्न का उत्तर, हालांकि, "नहीं" है। :)
अंकुरण

2
@sprugman: क्रोम में नहीं। इस विषय को लेकर एक लंबी बहस छिड़ गई है: code.google.com/p/v8/issues/detail?id=164
टिम डाउन

216

हां, उपयोग करने का एक तरीका है 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 पर दिखाया गया है।
राफेलडीडीएल

4
आप सीधे Object.values ​​(fruitObject) के साथ कर सकते हैं जो कुंजियों के बजाय मान लौटाएगा, और फिर अंतिम तत्व को वापस करने के लिए अपने सरणी में एक पॉप () करें।
यवॉन हुइन्ह

4
यहाँ पहला उत्तर सही उत्तर है। मैंने Object.keysकेवल यह पता लगाने की कोशिश की कि गुण वास्तव में बेतरतीब ढंग से ऑर्डर किए गए थे। आपके ब्राउज़र कंसोल में लॉग इन करने पर प्रदर्शित होने वाली वास्तविक संपत्ति क्रम से भिन्न होती है। जब ब्राउज़र कंसोल में लॉग इन किया जाता है, तो गुणों को स्वचालित रूप से पुन: व्यवस्थित किया जाता है और वर्णानुक्रम / संख्यात्मक रूप से प्रदर्शित किया जाता है, जो निश्चित रूप से कुछ भ्रम का कारण बनता है।
kennsorr

1
जेएस कल्पना कुंजी के आदेश की गारंटी नहीं देती है और यह अलग-अलग कार्यान्वयन (इंजन) के बीच भिन्न हो सकती है। इसलिए बेतरतीब ढंग से उत्पन्न (की) वस्तु के लिए सम्मिलन आदेश की गारंटी देना संभव नहीं है। ऐरे एक प्रकार का ऑब्जेक्ट है जहां अन्य उपयोगी गुणों के बीच सम्मिलन के आदेश की गारंटी के लिए कुंजी संख्यात्मक सूचकांक है।
एथन दोह

1
अच्छे लोगों को 2010-2013 में वापस वेब विकास करने में एक कठिन समय मिला ...
Merc

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

जहाँ obj आपकी वस्तु है


1
इसे अंतिम कुंजी मिलती है ( 'c'इस मामले में) लेकिन प्रश्न को इस तरह से शब्दबद्ध किया जाता है, जिसका अर्थ है कि पूछने वाला अंतिम मूल्य ( 'carrot') की तलाश में है। यह भी वास्तव में कुछ भी नहीं जोड़ता है जो पहले से ही क्रिस्टीना स्टेफानोवा के उत्तर
बामुपिन

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

स्रोत: http://javascriptweblog.wordpress.com


2
"अन्य वस्तु के माध्यम से पाशन की तुलना में"
sprugman

2
उन लोगों के लिए जिन्हें किसी वस्तु की पहली कुंजी प्राप्त करने की आवश्यकता है, वे उपरोक्त तरीके का अनुसरण कर सकते हैं, लेकिन इसके साथ: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"


5

जावास्क्रिप्ट में ऑब्जेक्ट प्रॉपर्टी के ऑर्डर के लिए, मैं सिर्फ इस उत्तर से लिंक करूंगा:

एक "के लिए (में ...)" लूप में तत्व आदेश

विशेष रूप से:

ECMAScript के सभी आधुनिक कार्यान्वयन वस्तु गुणों के माध्यम से उस क्रम में पुनरावृत्ति करते हैं जिसमें वे परिभाषित किए गए थे

इसलिए यहां हर दूसरा उत्तर सही है, वस्तु गुणों के लिए कोई आधिकारिक गारंटी वाला आदेश नहीं है। हालांकि व्यवहार में (किसी भी कीड़े को रोकना जो स्वाभाविक रूप से सेट-इन-स्टोन आधिकारिक तौर पर निर्दिष्ट व्यवहार को खराब कर सकता है)।

इसके अलावा, ऑब्जेक्ट संपत्तियों के डी-फैक्टो एन्यूमरेशन ऑर्डर को भविष्य के EMCAScript चश्मे में कोडित किए जाने की संभावना है।

फिर भी, इस समय मैं इसके आस-पास कोड नहीं लिखूंगा, क्योंकि ज्यादातर वस्तु-संपत्ति के आदेश से निपटने में मदद करने के लिए कोई अंतर्निहित उपकरण नहीं हैं। आप अपना खुद का लिख ​​सकते हैं, लेकिन अंत में आप हमेशा अपनी स्थिति का निर्धारण करने के लिए एक संपत्ति में प्रत्येक संपत्ति पर लूपिंग करेंगे।

जैसे कि आपके प्रश्न का उत्तर नहीं है , ऑब्जेक्ट के माध्यम से लूप करने के अलावा कोई रास्ता नहीं है।


जैसा कि आप कहते हैं, मैं निश्चित रूप से ऑब्जेक्ट प्रॉपर्टी एन्यूमरेशन के लिए किसी भी ऑर्डर पर निर्भर नहीं होता। एक शुरुआत के लिए, नए ECMAScript कार्यान्वयन इस डी वास्तविक मानक का पालन करने के लिए बाध्य नहीं हैं, इसलिए किसी विशेष आदेश पर निर्भर कोड भविष्य-प्रमाण नहीं है; इसके अलावा, सभी वर्तमान ब्राउज़र समान नहीं हैं। Chrome बग ट्रैकर पर इस चर्चा को देखें: code.google.com/p/v8/issues/detail?id=164 । अंत में, मुझे उम्मीद है कि ECMAScript युक्ति इसे जल्द ही किसी भी समय मानकीकृत नहीं करेगी।
टिम डाउन

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

आप यह कोशिश कर सकते हैं। यह अंतिम आइटम संग्रहीत करेगा। यहाँ obj को एरे में बदलना होगा। फिर सरणी pop()फ़ंक्शन का उपयोग करें जो परिवर्तित सरणी से अंतिम आइटम लौटाएगा।

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


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

जावास्क्रिप्ट में मानचित्र वस्तु । यह अब पहले से ही लगभग 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'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.