2013-08-12 4 views
11

मैं नेस्टेड वस्तुओं युक्त वस्तुओं के साथ json आधारित डेटा संरचना है। किसी विशेष डेटा तत्व तक पहुंचने के लिए मैं ऑब्जेक्ट गुणों के साथ संदर्भों को चेन कर रहा हूं। उदाहरण के लिए:पहुँच जावास्क्रिप्ट नेस्टेड वस्तुओं को सुरक्षित रूप से

var a = b.c.d; 

यदि बी या बी सी अनिर्धारित है, तो यह एक त्रुटि के साथ विफल हो जाएगा। हालांकि, मैं एक मूल्य प्राप्त करना चाहता हूं यदि यह मौजूद है अन्यथा अभी अनिर्धारित है। यह जांचने के बिना ऐसा करने का सबसे अच्छा तरीका क्या है कि श्रृंखला में हर मूल्य मौजूद है?

var a = b.getD(); 

या

var a = helpers.getDFromB(b); 

मैं भी कोशिश करना चाहते हैं:

मैं संभव के रूप में जनरल के रूप में इस विधि रखना चाहते हैं तो मैं जैसे सहायक तरीकों में से बड़ी संख्या को जोड़ने की जरूरत नहीं है कोशिश/पकड़ने से बचने के लिए क्योंकि यह कोई त्रुटि नहीं है इसलिए कोशिश/पकड़ का उपयोग करना गलत लगता है। क्या यह उचित है?

कोई भी विचार?

+2

http://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-string-key?rq=1 – goat

उत्तर

5

आप एक सामान्य विधि है कि संपत्ति के नाम की एक सरणी है कि गुण के माध्यम से एक मार्ग के रूप में व्याख्या की है के आधार पर एक तत्व का उपयोग बना सकते हैं:

var a = getValue(b, ["c", "d"]); 
:

function getValue(data, path) { 
    var i, len = path.length; 
    for (i = 0; typeof data === 'object' && i < len; ++i) { 
     data = data[path[i]]; 
    } 
    return data; 
} 

तो उसे अपने साथ कह सकते हैं

+0

यह देखते हुए कि ab === a ['b'] मुझे लगता है कि स्ट्रिंग का उपयोग करना वस्तुओं को संदर्भित करने के लिए जेएस में सबसे अच्छा अभ्यास माना जाता है? – Hubris

+0

@ हब्रिस - संपत्ति के नाम हमेशा तार होते हैं। डॉट नोटेशन को "सिंटेक्टिकल चीनी" माना जाता है (जो तब भी काम नहीं करता है जब संपत्ति का नाम आरक्षित शब्द है या वैध जेएस पहचानकर्ता नहीं है)। –

+0

ठीक है, मैंने यही सोचा था। बहुत बढ़िया। धन्यवाद :) – Hubris

6

स्टैंडर्ड दृष्टिकोण:

var a = b && b.c && b.c.d && b.c.d.e; 

काफी तेजी से लेकिन बहुत सुंदर नहीं (है तों लंबे समय से संपत्ति के नाम के साथ pecially)।

JavaScipt ऑब्जेक्ट गुणों को पार करने के लिए फ़ंक्शंस का उपयोग न तो कुशल और न ही सुरुचिपूर्ण है।

ऐसा करें:

try { var a = b.c.d.e; } catch(e){} 

मामले में आप निश्चित है कि a पहले से उपयोग नहीं किया गया है या

try { var a = b.c.d.e; } catch(e){ a = undefined; } 

आप इससे पहले कि यह सौंपा हो सकता है इस मामले में।

यह संभवतः पहले विकल्प भी तेज़ है।

0

यदि आप अनियमित गुणों के साथ गतिशील पहुंच प्राप्त करना चाहते हैं, तो ईएस 6 में आप आसानी से निम्नानुसार कर सकते हैं;

function getNestedValue(o,...a){ 
 
    var val = o; 
 
    for (var prop of a) val = typeof val === "object" && 
 
            val !== null  && 
 
            val[prop] !== void 0 ? val[prop] 
 
                 : undefined; 
 
    return val; 
 
} 
 
var obj = {a:{foo:{bar:null}}}; 
 
console.log(getNestedValue(obj,"a","foo","bar")); 
 
console.log(getNestedValue(obj,"a","hop","baz"));

1

यह एक पुरानी सवाल है और अब ES6 सुविधाओं के साथ, इस समस्या को और अधिक आसानी से हल किया जा सकता।

const idx = (p, o) => p.reduce((xs, x) => (xs && xs[x]) ? xs[x] : null, o); 

धन्यवाद इस solution के लिए @sharifsbeat करने के लिए।

0

शायद यह सरल किया जा सकता है:

let a = { a1: 11, b1: 12, c1: { d1: 13, e1: { g1: 14 }}} 
console.log((a || {}).a2); => undefined 
console.log(((a || {}).c1 || {}).d1) => 13 

और इतने पर।

संबंधित मुद्दे