2010-12-13 13 views
8

मैंजावास्क्रिप्ट: गतिशील चर नाम

var data = { 'name': { 'heading': 'Name', 'required': 1, 'type': 'String' }, 
      'profile': { 
        'age': { 'heading': 'Age', 'required': 0, 'type': 'Number' }, 
        'phone': { 'heading': 'Phone', 'required': 0, 'type': 'String'}, 
        'city': { 'heading': 'City', 'required': 0, 'type': 'String'}, 
        }, 
      'status': { 'heading': 'Status', 'required': 1, 'type': 'String' } 
      }; 

यहाँ की तरह एक नेस्ट जावास्क्रिप्ट वस्तु है का उपयोग कर JSON डेटा में प्रवेश नेस्टेड मानों, मैं data.profile.age.type या data.name.type जैसे क्षेत्रों तक पहुँच सकते हैं । कोई समस्या नहीं और यदि मेरे पास गतिशील चर नाम हैं, तो मैं नीचे तक पहुंच सकता हूं। फिर, कोई समस्या नहीं है।

f = 'profile'; data[f].age.type 

लेकिन, यहाँ मैं 'नाम', 'profile.age', 'profile.city' आदि और स्पष्ट रूप से मैं उन्हें के रूप में च = 'profile.age' उपयोग नहीं कर सकते जैसे चर नाम है; डेटा [एफ]। टाइप जो काम नहीं करेगा।

क्या कोई मुझे मार्गदर्शन कर सकता है कि उन्हें सबसे आसान और सरल तरीके से कैसे प्राप्त करें (प्राप्त करें/सेट करें)?

नोट: मैंने कोशिश की और यह पाने के लिए काम करता है।

data.get = function(p) { o = this; return eval('o.'+p); }; 
f = 'profile.age'; data.get(f).name; 

हालांकि सेट पर्याप्त सरल प्रतीत नहीं होता है। अगर मुझे पाने और सेट करने के लिए बेहतर समाधान भी हैं, तो कृपया मुझे बताएं।

+2

आप इतने पर इस सवाल पूछने के लिए सही थे। जब भी आप जावास्क्रिप्ट में eval का उपयोग कर खुद को पाते हैं, तो आप लगभग निश्चित रूप से गलत काम कर रहे हैं। –

+0

मुझे eval के बारे में बताने के लिए धन्यवाद। बुरा हो सकता है बुराई है! :-) – rsmoorthy

+0

आपने यह कहा था। यहां दिए गए अंतिम सुझाव पर एक नज़र डालें: http://javascript.crockford.com/code.html –

उत्तर

7

जब तक बिल्कुल जरूरी eval प्रयोग न करें। :) कम से कम इस मामले में, वहाँ बेहतर तरीके यह करने के लिए कर रहे हैं - आप अलग-अलग भागों में नेस्टेड नाम विभाजित है और उन पर पुनरावृति कर सकते हैं:

data.get = function(p) { 
    var obj = this; 

    p = p.split('.'); 
    for (var i = 0, len = p.length; i < len - 1; i++) 
    obj = obj[p[i]]; 

    return obj[p[len - 1]]; 
}; 

data.set = function(p, value) { 
    var obj = this; 

    p = p.split('.'); 
    for (var i = 0, len = p.length; i < len - 1; i++) 
    obj = obj[p[i]]; 

    obj[p[len - 1]] = value; 
}; 
+0

धन्यवाद। बहुत तेज़ प्रतिक्रिया और सहायक। – rsmoorthy

8

तुम बस घोंसला कर सकते हैं कोष्ठक:

var a = 'name', b = 'heading'; 
data[a][b]; // = `Name` 
+1

यह सवाल का जवाब नहीं दे रहा है ... – vsync

+1

@vsync: निश्चित रूप से यह करता है। मैं कह रहा हूं कि 'var a =' name.heading 'के बजाय; डेटा [ए] ', आप ऑब्जेक्ट के गहरे स्तर तक पहुंचने के लिए ब्रैकेट के लगातार सेट का उपयोग कर सकते हैं। तो यदि आप जानते हैं कि आप 'प्रोफ़ाइल' ऑब्जेक्ट में कुछ ढूंढ रहे हैं, 'var a =' profile ', b =' age '; डेटा [ए] [बी] 'काम करता है। जाहिर है, अगर आपको मनमाने ढंग से स्ट्रिंग को संभालने की ज़रूरत है, तो अन्य उत्तरों दिखाते हैं कि यह कैसे करें। यह एक विकल्प है अगर किसी को मनमाने ढंग से '" a.b.c.d "' तारों को पार्स करने की जटिलता की आवश्यकता नहीं है। – josh3736

2

शायद एक समारोह है कि संपत्ति में आपकी रुचि है के लिए पथ में लेता है और यह को तोड़ता गुण का प्रतिनिधित्व टोकन में। कुछ इस तरह (यह, बहुत मोटा है निश्चित रूप से):

data.get = function(path) { 
    var tokens = path.split('.'), val = this[tokens[0]]; 
    if (tokens.length < 2) return val; 
    for(var i = 1; i < tokens.length; i++) { 
    val = val[tokens[i]]; 
    } 
    return val; 
} 

उदाहरण:

var f = 'one.two'; 
    var data = { one: {two:'hello'}}; 
    data.get = /* same as above */; 

    var val = data.get(f); 
0

यह नीचे पार करने के लिए jquery.each() फ़ंक्शन का उपयोग करता है एक स्ट्रिंग वैरिएबल का उपयोग कर एक जेसन पेड़ जिसमें एक या अधिक "।" हो सकता है या नहीं। आप वैकल्पिक रूप से एक सरणी में गुजर सकते हैं और .split() को छोड़ सकते हैं;

pathString = "person.name"

jsonObj = { "व्यक्ति": { "नाम": "वैलेरी"}} की तरह कुछ की तरह कुछ।

function getGrandchild(jsonObj, pathString){ 
    var pathArray = pathString.split("."); 
    var grandchild = jsonObj; 
    $.each(pathArray, function(i, item){ 
     grandchild = grandchild[item]; 
    }); 
    return grandchild; 
}; 

रिटर्न "वैलेरी"

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