जावास्क्रिप्ट में एक स्ट्रिंग के रूप में परिवर्तनीय नाम


154

क्या जावास्क्रिप्ट में एक स्ट्रिंग के रूप में एक चर नाम प्राप्त करने का एक तरीका है? (चाहते NSStringFromSelectorमें कोको )

मैं इस तरह से करना चाहूंगा:

var myFirstName = 'John';
alert(variablesName(myFirstName) + ":" + myFirstName);

--> myFirstName:John

अपडेट करें

मैं जावास्क्रिप्ट का उपयोग करके एक ब्राउज़र और दूसरे प्रोग्राम को कनेक्ट करने का प्रयास कर रहा हूं। मैं कॉलबैक विधि के लिए एक ब्राउज़र से दूसरे प्रोग्राम में इंस्टेंस नाम भेजना चाहूंगा:

FooClass = function(){};
FooClass.someMethod = function(json) {
  // Do something
}

instanceA = new FooClass();
instanceB = new FooClass();
doSomethingInAnotherProcess(instanceB); // result will be substituted by using instanceB.someMethod();

...

एक अन्य कार्यक्रम से:

evaluateJavascriptInBrowser("(instanceName).someMethod("resultA");");

PHP में: PHP में एक स्ट्रिंग के रूप में एक चर नाम कैसे प्राप्त करें?


2
@ डेल्नायन वास्तव में, +1। मैं इसे "यदि आप लिख सकते हैं variablesName(myFirstName), तो आप वैरिएबल का नाम पहले से ही जानते हैं।" मैं कोशिश कर रहा हूँ, लेकिन मैं नहीं कर सकता ...
deceze


1
हो सकता है कि आप एक चर में संग्रहीत कर सकते हैं और बाद में इसे उदाहरण के लिए json में परिवर्तित कर सकते हैं {"इंस्टा": इंस्टा} और इसे अजाक्स या कॉल / पोस्ट कॉल का उपयोग करके सर्वर पर भेजें और आप php में प्रक्रिया कर सकते हैं और उदाहरण का नाम प्राप्त कर सकते हैं ...
जियोमोरिलो

@ डिसेज़, निश्चित रूप से, आप नाम जानते हैं, लेकिन इसका मतलब यह नहीं है कि आप इसे मैन्युअल रूप से टाइप करना चाहते हैं / कर सकते हैं। हो सकता है कि आप डिबगिंग उद्देश्यों के लिए चर का एक गुच्छा डंप करना चाहते हैं और console.log("myvar = " + myvar);प्रत्येक चर के लिए मैन्युअल रूप से बार-बार टाइप करने का मन नहीं करता है ।
सिनटेक

जवाबों:


54

आमतौर पर, आप किसी ऐसी स्थिति के लिए हैश तालिका का उपयोग करते हैं, जहाँ आप किसी नाम को कुछ मूल्य पर मैप करना चाहते हैं, और दोनों को पुनः प्राप्त करने में सक्षम हो सकते हैं।

var obj = { myFirstName: 'John' };
obj.foo = 'Another name';
for(key in obj)
    console.log(key + ': ' + obj[key]);


125
हालांकि इस सवाल का जवाब नहीं है।
htafoya

1
@htafoya: अप्रत्यक्ष रूप से, हाँ - सभी गुण जोड़े के objरूप में मुद्रित होते हैं name: value। लेकिन व्याख्यात्मक पाठ अधिक स्पष्ट हो सकता है।
मैट

1
@ मैं कोड को समझता हूं, लेकिन आमतौर पर ओपी प्रश्न का उपयोग डायनामिक असाइनमेंट के रूप में कुछ अधिक जटिल के लिए किया जाता है जहां आप एक उत्पन्न स्ट्रिंग से चर का चयन कर सकते हैं। या जहां एक मान को छापने के लिए केवल एक शब्दकोश बनाना ओवरकिल है।
htafoya

2
@htafoya - हाँ, C # में nameof (varname) जैसा कुछ सरल है।
मैट

1
मुझे लगता है कि इसका एकमात्र कारण "सवाल का जवाब नहीं देता" है, क्योंकि यह "आप जावास्क्रिप्ट में स्थिरांक या चर का नाम नहीं प्राप्त कर सकते हैं।" यह अन्य जवाब: stackoverflow.com/a/37393679
bigpopakap

86

सेठ के जवाब की तरह, लेकिन Object.keys()इसके बजाय उपयोग करता है :

const varToString = varObj => Object.keys(varObj)[0]

const someVar = 42
const displayName = varToString({ someVar })
console.log(displayName)


5
@titusfx आप लेट या वर् के लिए कॉन्स्टैप्ट को स्वैप कर सकते हैं और यह उसी तरह काम करता है। लेकिन यदि आप पहली जगह में विनाशकारी वस्तु के लिए एक ट्रांसपिलर का उपयोग कर रहे हैं, तो यह संभवतः पहले से ही कॉन्स्ट का समर्थन करता है।
सेठहाइट

यह ES6 का उपयोग करने पर निर्भर करता है?
O'Rooney

1
@ ओ'रोनी हाँ, यह ES6 विशिष्ट है।
डोनट्स

63

आप अपनी समस्या को हल करने के लिए निम्नलिखित समाधान का उपयोग कर सकते हैं:

const myFirstName = 'John'
Object.keys({myFirstName})[0]

// returns "myFirstName"

3
यह उत्तर [@ सेथाइट के] ( stackoverflow.com/a/39669231/5876282 ) के समान है लेकिन बहुत सरल है। धन्यवाद! @bluejayke मुझे लगता है कि यह उत्तर मूल स्वीकृत उत्तर के वर्षों बाद आता है। लेकिन हाँ, वर्तमान में यह सबसे अच्छा है - सिवाय इसके कि शायद "पॉप ()" उपयोग का सुझाव नीचे
B चार्ल्स एच।

1
क्या यह संभव है कि फंक्शन को बनाया जाए जो वेरिएबल को स्वीकार करे और उसका नाम प्रिंट करे? मैंने आपके कोड को एक फ़ंक्शन के अंदर लपेटने की कोशिश की है, लेकिन आईडी ने मुझे नाम लौटाया जो तर्क के रूप में इस्तेमाल किया गया था
वाकन टंका

@WakanTanka यदि यो एक उचित प्रश्न बनाते हैं, तो मैं इसका उत्तर दूंगा।
फेलो स्ट्रेंजर

@WakanTanka नहीं, यह काम नहीं करेगा। जैसा कि आपने खोजा था, यह केवल उस नाम को प्रिंट करेगा जिसे आप फ़ंक्शन तर्क देते हैं। मुझे लगता है कि यह देखने में मदद करता है कि इस तरह के एक फ़ंक्शन एक पुराने जावास्क्रिप्ट युक्ति को कैसे संकलित करेगा। आप इस उदाहरण ( jsfiddle.net/bigpopakap/wq891ghr/2 ) में देख सकते हैं कि {वेरिएबल} सिंटैक्स {वेरिएबल: वेरिएबल} के लिए छोटा है, इसलिए कॉलिंग फ़ंक्शन से वेरिएबल नाम का उपयोग करना असंभव है
bigpopakap

42

ES6 में, आप कुछ इस तरह लिख सकते हैं:

let myVar = 'something';
let nameObject = {myVar};
let getVarNameFromObject = (nameObject) => {
  for(let varName in nameObject) {
    return varName;
  }
}
let varName = getVarNameFromObject(nameObject);

वास्तव में सबसे अच्छी दिखने वाली चीज नहीं है, लेकिन यह काम हो जाता है।

यह ES6 की वस्तु को नष्ट करने का लाभ उठाता है।

अधिक जानकारी यहाँ: https://hacks.mozilla.org/2015/05/es6-in-depth-destructuring/


1
बहुत बढ़िया जवाब!! विनाशकारी वस्तु का यह विशेष उपयोग मेरे लिए नया है (पंक्ति 2 let nameObject = {myVar}इतना उपयोगी है! यह कहीं भी प्रलेखित नहीं लगता है। किसी भी लिंक को मिला है?
लॉरेंस लॉर्ड

2
@ लॉरेंस लॉर्ड इसे संपत्ति आशुलिपि कहते हैं। एक परिभाषा के बिना एक वस्तु संपत्ति सौंपना (कुछ: 'asdf'), जेएस को चर के नाम और इसके मूल्य {कुछ} === {कुछ: कुछ} के साथ संपत्ति को परिभाषित करने का कारण होगा। ariya.io/2013/02//
सेथ वाइट

19
var x = 2;
for(o in window){ 
   if(window[o] === x){
      alert(o);
   }
}

हालाँकि, मुझे लगता है कि आपको "karim79" पसंद करना चाहिए


8
यह केवल विंडो स्कोप पर काम करेगा (किसी फ़ंक्शन के अंदर ब्रेक होने पर)।
जिपिलोरा

1
सहमत - लेकिन यह ओपी के सवाल का जवाब देने के सबसे करीब है। जी जे।
दिम्बिंस्की

यह भी कि यदि आप किसी आदिम का परीक्षण कर रहे हैं, तो यह उन सभी चर को सचेत करेगा, जिनका मूल्य समान है, या यदि दो चर में एक ही वस्तु है, जो उन्हें सौंपी गई है। उदाहरण के लिए यदि पहली पंक्ति थी x = 2; y = 2;या x = {a:1}; b = x;यह उनमें से प्रत्येक को सचेत करेगा
अलजगोम

यदि आप चाहते हैं कि यह एक फंक्शन स्कोप में काम करे, तो आप विंडो के बजाय फंक्शन नाम का उपयोग करके देख सकते हैं, जैसे: var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } }तब कॉलिंग f()'x' को अलर्ट करेगा
aljgom

1
@ जालजोम - अच्छी बात। यहाँ यह कोशिश करने के लिए एक बेला है।
मैट

16

यह मूल भावों के लिए काम करता है

const nameof = exp => exp.toString().match(/[.](\w+)/)[1];

उदाहरण

nameof(() => options.displaySize);

स्निपेट:

var nameof = function (exp) { return exp.toString().match(/[.](\w+)/)[1]; };
var myFirstName = 'Chuck';
var varname = nameof(function () { return window.myFirstName; });
console.log(varname);


2
यह वास्तव में बहुत अच्छी तरह से काम करता है! एकमात्र समस्या यह है कि जब आप कुछ इस तरह से पास करते हैं: nameof () => options.subOptions.displaySize) जो "सबऑक्शंस" देता है इसके बजाय, मैंने इस regex का उपयोग किया: exp.toString ()। match (/? = [^] ।] * $) (\ w +) / g) [०]
जिम ब्राउन

मुझे इससे अपरिभाषित मिलता है: var a = {b: "c"}; चेतावनी (नाम (क)); function name (exp) {exp.toString ()। match (/? = [^।] * $) (\ w +) / g) [0]; } // नाम
डेविड स्पेक्टर

@JimBrown, धन्यवाद! आपकी टिप्पणी को उत्तर के रूप में चिह्नित करने की आवश्यकता है!
evorios

14

संभवतः पॉप सुरक्षा के लिए [0] के साथ अनुक्रमण से बेहतर होगा, (चर शून्य हो सकता है)।

const myFirstName = 'John'
const variableName = Object.keys({myFirstName}).pop();
console.log(`Variable ${variableName} with value '${variable}'`);

// returns "Variable myFirstName with value 'John'"

3
यदि myFirstName तर्क v के रूप में एक फ़ंक्शन (इस कोड वाले) को पास किया जाता है, तो myFirstName के बजाय वेरिएनेम को v के रूप में रिपोर्ट किया जाता है।
डेविड स्पेक्टर

9
var somefancyvariable = "fancy";
Object.keys({somefancyvariable})[0];

यह फ़ंक्शन में नहीं बनाया जा सकता क्योंकि यह फ़ंक्शन के चर का नाम देता है।

// THIS DOESN'T WORK
function getVarName(v) {
    return Object.keys({v})[0];
}
// Returns "v"

संपादित करें: के लिए धन्यवाद @Madeo के लिए उनका कहना है कि कैसे एक समारोह में इस बनाने के लिए

function debugVar(varObj) {
    var varName = Object.keys(varObj)[0];
    console.log("Var \"" + varName + "\" has a value of \"" + varObj[varName] + "\"");
}

आपको चर वाले एकल तत्व सरणी के साथ फ़ंक्शन को कॉल करना होगा। debugVar({somefancyvariable});
संपादित करें: Object.keysकेवल keysहर ब्राउज़र में इसका परीक्षण किया जा सकता है, लेकिन टिप्पणियों के अनुसार यह हर जगह काम नहीं करता है।


त्रुटि: "चर कुंजी नहीं पा सकते हैं"
अलेक्जेंडर वोल्कोव

चाबियों को परिभाषित नहीं किया गया है
हिमस्खलन 1

1
यह इस तरह होना चाहिए const getVarName = (v) => Object.keys(v)[0];और फिर फ़ंक्शन को इस तरह से कॉल करेंgetVarName({whatEverVariable})
मेडो

6

ECMAScript 5.1 के बाद से आप ऑब्जेक्ट से सभी प्रॉपर्टी के नाम पाने के लिए Object.keys का उपयोग कर सकते हैं ।

यहाँ एक उदाहरण है:

// Get John’s properties (firstName, lastName)
var john = {firstName: 'John', lastName: 'Doe'};
var properties = Object.keys(john);

// Show John’s properties
var message = 'John’s properties are: ' + properties.join(', ');
document.write(message);


4

जब कोई फ़ंक्शन होता है तो एक फ़ंक्शन लिखता है जो विभिन्न वैश्विक चर मानों को बदलता है यह हमेशा myfirstname नहीं होता है जो कुछ भी होता है वह गुजर रहा है। मेरे लिए यह काम करने की कोशिश करो।

Jsfiddle में चलाएं

var jack = 'jill';
function window_getVarName(what)
{
  for (var name in window)
  {
    if (window[name]==what)
    return(name);
  }
  return("");
}
document.write(window_getVarName(jack));

खिड़की 'जैक' को लिखेंगे।


2
यह विश्वसनीय नहीं है। समान मान के साथ विंडो ऑब्जेक्ट पर किसी भी प्रकार के चर हो सकते हैं।
टेलर बुकानन

2

आप जावास्क्रिप्ट में प्रकारों को प्रतिबिंबित कर सकते हैं और गुणों और विधियों का नाम प्राप्त कर सकते हैं, लेकिन आपको Lambda Expressions Trees.NET में जैसे sth की आवश्यकता है , मुझे लगता है कि जावास्क्रिप्ट में गतिशील प्रकृति और स्थिर प्रकार प्रणाली की कमी के कारण यह संभव नहीं है।


3
मुझे नहीं लगता कि जेएस लंबोदा या कार्यात्मक प्रोग्रामिंग के संबंधित उपकरणों से कम है।

लेकिन मुझे लगता है कि .NET में अभिव्यक्ति पेड़ के बराबर कोई संरचना नहीं है।
जहान

2

मुझे इसकी आवश्यकता थी, वस्तुओं का उपयोग नहीं करना चाहते थे, और निम्नलिखित समाधान के साथ आए, सवाल को घुमाते हुए।

चर नाम को एक स्ट्रिंग में बदलने के बजाय, मैं एक स्ट्रिंग को एक चर में परिवर्तित करता हूं।

यह केवल तभी काम करता है जब चर नाम निश्चित रूप से ज्ञात हो।

इसे लो:

var height = 120;
testAlert(height);

यह प्रदर्शित होना चाहिए:

height: 120

इसे इस तरह किया जा सकता है:

function testAlert(ta)
{
    a = window[ta];
    alert(ta + ': ' + a); 
}

var height = 120;
testAlert("height");
// displays: height: 120

इसलिए मैं स्ट्रिंग का उपयोग करता हूं "height"और इसे कमांड heightका उपयोग करके एक चर में बदल देता हूं window[]


2
आपके दूसरे मामले में, ऊंचाई windowऑब्जेक्ट की एक संपत्ति है क्योंकि खिड़की के दायरे में एक ही नाम का चर घोषित किया गया था। यह तभी काम करता है जब चर को विंडो स्कोप में घोषित किया जाता है, फ़ंक्शन / क्लोजर में नहीं।
xoxox

2

एक चर के रूप में चर नाम प्राप्त करने के लिए मैंने अब तक पाया शॉर्ट्स तरीका:

const name = obj => Object.keys(obj)[0];

const whatsMyName = "Snoop Doggy Dogg";

console.log( "Variable name is: " + name({ whatsMyName }) );
//result: Variable name is: whatsMyName


1

यह Internet Explorer (9, 10 और 11), Google Chrome 5 का उपयोग करके काम करता है:

   
var myFirstName = "Danilo";
var varName = Object.keys({myFirstName:0})[0];
console.log(varName);

ब्राउज़र संगतता तालिका:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


Google Chrome 5 वास्तव में??
हिमस्खलन १

2
@ हिमस्खलन 1, एमडीएन संस्करण संगतता तालिका के अनुसार।
डेनिलो

0

मैंने यह फ़ंक्शन JSON के आधार पर बनाया है जैसा कि किसी ने सुझाव दिया, मेरी डिबग आवश्यकताओं के लिए ठीक काम करता है

function debugVar(varNames){
let strX = "";
function replacer(key, value){
    if (value === undefined){return "undef"}
    return value
    }    
for (let arg of arguments){
let lastChar;
    if (typeof arg!== "string"){
        let _arg = JSON.stringify(arg, replacer);
        _arg = _arg.replace('{',"");
        _arg = _arg.replace('}',"");            
        _arg = _arg.replace(/:/g,"=");
        _arg = _arg.replace(/"/g,"");
        strX+=_arg;
    }else{
    strX+=arg;
    lastChar = arg[arg.length-1];
    }
    if (arg!==arguments[arguments.length-1]&&lastChar!==":"){strX+=" "};
}
console.log(strX)    
}
let a = 42, b = 3, c;
debugVar("Begin:",{a,b,c},"end")


-3

नहीं वहाँ नहीं है।
इसके अलावा, यदि आप लिख सकते हैं variablesName(myFirstName), तो आप पहले से ही चर नाम ("myFirstName") को जानते हैं।


11
जरूरी नहीं कि अगर कोड को छोटा किया जा रहा है तो सच है;)
गुप्त

9
इसके अलावा nameof(myVariable)C # में उदाहरण का उपयोग करने का बिंदु (जो एक स्ट्रिंग "myVariable" लौटाता है, जब कोड को अन्य परिवर्तन करने या बनाने में गलतियों के खिलाफ कवच होता है। एक सामान्य उपयोग का मामला चर के नाम को एक त्रुटि संदेश में जोड़ने के लिए है। अधिकांश भाग मैं स्ट्रिंग शाब्दिकों को एक कोड गंध मानता हूं, और संदेह है कि कम से कम विज़ुअल स्टूडियो क्यों, उन्हें लाल / नारंगी रंग में दिखाता है। मुझे पता है कि मुझे पता है, यह सवाल जावास्क्रिप्ट के बारे में है, लेकिन मैंने अभी समझाया कि मैं यहां क्यों समाप्त हुआ।
merrr

var परीक्षण = 1235125142; कंसोल.लॉग (Object.keys ({test})। पॉप ()) // "टेस्ट"
ब्लूजैक

1
@bluejayke मुझे अज्ञानी कहते हैं, लेकिन 8 वर्षों के बाद भी मैं यह देखने में विफल हूं कि console.log('test')यह वास्तव में या इससे बेहतर कैसे है जब आपको इसकी आवश्यकता होगी।
deceze
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.