2012-11-28 15 views
23

यह एक स्ट्रिंग के रूप वस्तु संपत्ति नाम पाने के लिए संभव हैस्ट्रिंग के रूप वस्तु संपत्ति नाम प्राप्त

person = {}; 
person.first_name = 'Jack'; 
person.last_name = 'Trades'; 
person.address = {}; 
person.address.street = 'Factory 1'; 
person.address.country = 'USA'; 

मैं इस तरह इसका इस्तेमाल करना चाहते हैं:

var pn = propName(person.address.country); // should return 'country' or 'person.address.country' 
var pn = propName(person.first_name);  // should return 'first_name' or 'person.first_name' 

उन्नत में धन्यवाद

नोट: यह कोड वही है जो मैं ढूंढ रहा हूं। मैं समझता हूं कि यह बेवकूफ लगता है, लेकिन ऐसा नहीं है।

यही वह है जो मैं इसके साथ करना चाहता हूं।

एचटीएमएल

person = {}; 
person.id_first_name = 'Jack'; 
person.id_last_name = 'Trades'; 
person.address = {}; 
person.address.id_address = 'Factory 1'; 
person.address.id_country = 'USA'; 


extPort.postMessage 
(
    { 
    message : MSG_ACTION, 
    propName(person.first_name): person.first_name 
    } 
}; 

---------------------- उत्तर ------------ -----------

इसे ibu के लिए धन्यवाद मिला। उन्होंने कहा कि सही तरीके से इशारा किया और मैं एक पुनरावर्ती समारोह

इस्तेमाल किया
var res = ''; 

function propName(prop, value) { 
    for (var i in prop) { 
     if (typeof prop[i] == 'object') { 
      if (propName(prop[i], value)) { 
       return res; 
      } 
     } else { 
      if (prop[i] == value) { 
       res = i; 
       return res; 
      } 
     } 
    } 
    return undefined; 
} 

var pn = propName(person, person.first_name); // returns 'first_name' 
var pn = propName(person, person.address.country); // returns 'country' 

डेमो: http://jsbin.com/iyabal/1/edit

+7

मैं उलझन में हूं ... आप क्यों चाहते हैं कि संपत्ति का नाम वही चीज़ लौटाए जो आपने इसे खिलाया था? आप पहले से ही संपत्ति का नाम जानते हैं ... यदि आप गुणों के माध्यम से पुन: प्रयास करने के लिए एक रास्ता तलाश रहे हैं, तो आप कुंजी के माध्यम से ब्रैकेट नोटेशन और लूप का उपयोग कर सकते हैं, क्योंकि गुण भी हैश इंडेक्स – RonaldBarzell

+0

आपको संदर्भ भी पास करना होगा समारोह में वस्तु। –

+0

स्वचालित रूप से नहीं। 'देश' संपत्ति द्वारा संदर्भित स्ट्रिंग को 'पता' ऑब्जेक्ट के बारे में कुछ भी पता नहीं है, और 'पता' संपत्ति द्वारा संदर्भित ऑब्जेक्ट को 'व्यक्ति' ऑब्जेक्ट के बारे में कुछ भी पता नहीं है। –

उत्तर

2

हाँ आप कर सकते हैं, एक छोटे से बदलाव के साथ।

function propName(prop, value){ 
    for(var i in prop) { 
     if (prop[i] == value){ 
      return i; 
     } 
    } 
    return false; 
} 

अब आप तो जैसे मूल्य प्राप्त कर सकते हैं:

var pn = propName(person,person.first_name); 
// pn = "first_name"; 

नोट मुझे यकीन है कि क्या इसके लिए इस्तेमाल किया जा सकता नहीं हूँ।

अन्य नोट नेस्टेड ऑब्जेक्ट्स के साथ बहुत अच्छी तरह से काम नहीं करेगा। लेकिन फिर, पहले नोट देखें।

+9

यह मानता है कि किसी भी दो गुणों में किसी ऑब्जेक्ट में समान मूल्य नहीं होगा। – Sampson

+0

... और यह नेस्टेड वस्तुओं के लिए पर्याप्त नहीं है। – Christophe

+0

यह केवल एक स्तर गहरा चला जाता है। – Ivan

0

नहीं, यह संभव नहीं है।

इस कल्पना कीजिए:

person.age = 42; 
person.favoriteNumber = 42; 

var pn = propName(person.age) 
// == propName(42) 
// == propName(person.favoriteNumber); 

संपत्ति नाम के संदर्भ में बस है कि इस प्रक्रिया में खो जाता है।

+1

डाउनवोट क्यों ? कोई काउंटर-तर्क? –

0

आप ऑब्जेक्ट के लिए नेमस्पेसिंग विधि बना सकते हैं। विधि को ऑब्जेक्ट को म्यूटेट करने की आवश्यकता होगी ताकि तार दो गुणों को रखने के बजाय ऑब्जेक्ट बन जाए, value और _namespace

डेमो: http://jsfiddle.net/y4Y8p/1/

var namespace = function(root, name) { 
    root._namespace = name; 
    function ns(obj) { 
     for(var i in obj) { 
      var a = obj._namespace.split('.') 
      if (a.length) { 
       a.push(i); 
      } 
      if(typeof obj[i] == 'object') { 
       obj[i]._namespace = a.join('.'); 
       ns(obj[i]); 
       return; 
      } 
      if(typeof obj[i] == 'string') { 
       var str = obj[i].toString(); 
       obj[i] = { 
        _namespace: a.join('.'), 
        value: str 
       }; 
      } 
     } 
    } 
    ns(root); 
}; 

namespace(person, 'person'); 

console.log(person.address.street._namespace) // person.address.street 
console.log(person.address.street.value) // 'Factory 1' 
तो अब

आप कर सकते हैं:

var o = { message: MSG_ACTION }; 
o[ person.first_name._namespace ] = person.first_name.value; 

extPort.postMessage(o); 
+0

मैं इस जवाब से मोहक था इसलिए मैंने क्लीनर दृष्टिकोण को खोजने और खोजने के लिए इसे दूर करना शुरू कर दिया। यहां तक ​​कि मैं अब तक क्या आया हूं, आपको क्या लगता है: http://jsfiddle.net/y4Y8p/17/ –

+0

@JasonSperske अच्छा है, लेकिन यह रिकर्सिव नहीं है इसलिए यह केवल 3 स्तरों को गहराई से काम करता है: http: // jsfiddle.net/y4Y8p/18/ – David

+0

http://jsfiddle.net/y4Y8p/22/ इसे अभी आज़माएं :) अभी भी बड़ी समस्याएं हैं, जैसे कि यह सभी मान लेता है और उन्हें तारों पर रखता है, लेकिन यह एक मजेदार बिट है –

3

आप एक समारोह में अपनी संपत्ति लपेट और फिर एक स्ट्रिंग के लिए समारोह को परिवर्तित करने और संपत्ति बाहर निकल सकते हैं इसका

उदाहरण के लिए:

function getPropertyName(propertyFunction) { 
    return /\.([^\.;]+);?\s*\}$/.exec(propertyFunction.toString())[1]; 
} 

तो यह उपयोग करने के लिए:

var myObj = { 
    myProperty: "testing" 
}; 

getPropertyName(function() { myObj.myProperty; }); // myProperty 

यह ES6 वाक्य रचना के साथ एक सा अच्छे लग रहा है:

getPropertyName(() => myObj.myProperty); 

हालांकि मैं 100% यकीन नहीं है जो स्ट्रिंग की तरह function() { ... } वापस करेगा। मैंने इसे केवल एक ट्रांसलेटर के माध्यम से उपयोग किया है।

+4

के साथ खेलने के लिए कोड बस मिनीफैक्शन के साथ इसका उपयोग करते समय देखें ... –

+0

ग्रेट .. यह मेरी मदद करता है .. धन्यवाद –

12

मुझे Object.keys(your_object) का उपयोग करने का सबसे अच्छा अभ्यास पता है। यह आपके लिए सरणी संपत्ति नाम का विश्लेषण करेगा। उदाहरण:

var person = { firstName: 'John', lastName: 'Cena', age: '30' }; 
var listPropertyNames = Object.keys(person); //["firstName", "lastName", "age"] 

मुझे आशा है कि यह उदाहरण आपके लिए उपयोगी होगा।

+5

कम किया जाना चाहिए 'चाबियाँ'। – madprops

0

मैं एक ही स्थिति में हूं। ,

var myObject = { 
'a': 1, 
'b': 2, 
'c': 3 
} 
_.findKey(myObject, function(curValue) { return myObject.a === curValue }); 

सादा जावास्क्रिप्ट

function getPropAsString(source, value){ 
    var keys = Object.keys(source); 

    var curIndex, 
     total, 
     foundKey; 

    for(curIndex = 0, total = keys.length; curIndex < total; curIndex++){ 
     var curKey = keys[ curIndex ]; 
     if (source[ curKey ] === value){ 
      foundKey = curKey; 
      break; 
     } 
    } 

    return foundKey; 
} 

var myObject = { 
'a': 1, 
'b': 2, 
'c': 3 
} 
getPropAsString(myObject, myObject.a) 

लेकिन मैं ठीक करने के लिए पसंद करेंगे:

यहाँ अद्वितीय होना, यह Lodash या UnderScore लाइब्रेरी का उपयोग किया जाना तेरा रास्ता है मूल्य में से एक सीमा के साथ समाधान के रूप में कोड। एक उदाहरण:

var myObject = { 
'a': {key:'a', value:1}, 
'b': {key:'b', value:2}, 
'c': {key:'c', value:3} 
} 

console.log(myObject.a.key) 
0

बंद करने का उपयोग करके ऐसा करने का तरीका है। ईएस 6 सिंटैक्स

var person = {}; 
person.firstname = 'Jack'; 
person.address = "123 Street"; 

function getPropertyName(obj, expression) { 
    var res = {}; 
    Object.keys(obj).map(k => { res[k] =() => k; }); 
    return expression(res)(); 
} 

let result = getPropertyName(person, o => o.address); 
console.log(result); // Output: 'address'