জাভাস্ক্রিপ্টের স্ট্রিং হিসাবে পরিবর্তনীয় নাম


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");");

পিএইচপি-তে: পিএইচপি-তে স্ট্রিং হিসাবে একটি পরিবর্তনশীল নাম কীভাবে পাবেন?


2
@ ডেলান আসলেই, +1 আমি "আপনি যদি লিখতে পারেন তবে আপনি variablesName(myFirstName)ভেরিয়েবলের নামটি ইতিমধ্যে জানেন " এর চেয়ে অন্য উপায় রাখার কথা ভাবতে পারি না । আমি চেষ্টা করছি, কিন্তু আমি যা করতে পারেন ...
deceze

2
প্রতারিত? stackoverflow.com/questions/417645/…
বেন

1
সম্ভবত তার জন্য আপনি কোনও পরিবর্তনশীল হিসাবে সঞ্চয় করতে পারেন এবং পরে এটি জেসসনে রূপান্তর করতে পারেন উদাহরণস্বরূপ {"উদাহরণA": উদাহরণA} এবং এটি আজাক্স ব্যবহার করে সার্ভারে প্রেরণ করতে পারেন বা কল পেতে / পোস্ট করতে পারেন এবং পিএইচপি তে প্রক্রিয়া করতে পারেন এবং উদাহরণটির নাম পেতে পারেন ...
জিওমরিলো

@ অনুগ্রহ করে নিশ্চিত হয়ে নিন যে আপনি নামটি জানেন, তবে এর অর্থ এই নয় যে আপনি ম্যানুয়ালি টাইপ করতে পারবেন / করতে পারেন। সম্ভবত আপনি ডিবাগিংয়ের উদ্দেশ্যে ভেরিয়েবলগুলির একটি গুচ্ছ ডাম্প করতে চান 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 - হ্যাঁ, সি # তে নামফ (বর্ণনাম) এর মতো সাধারণ কিছু।
ম্যাট

1
আমি মনে করি এটি "প্রশ্নের উত্তর দেয় না" এর একমাত্র কারণ হ'ল জাভা স্ক্রিপ্টে আপনি ধ্রুবকের নাম বা পরিবর্তনশীলটির নাম পেতে পারেন না you আপনি যা চান তার নিকটতম জিনিস ... "যেমন এই অন্য উত্তর: 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
@ টিটাসফেক্স আপনি লেট বা ভেরির জন্য কনটকে সরিয়ে নিতে পারবেন এবং এটি ঠিক একইরকম কাজ করে। তবে আপনি যদি প্রথমে অবজেক্টের ডেস্ট্রাকচারিংয়ের জন্য কোনও ট্রান্সপ্লেলার ব্যবহার করেন তবে এটি সম্ভবত ইতিমধ্যে কনস্টকে সমর্থন করে।
শেঠহাইট

এটি ES6 ব্যবহারের উপর নির্ভর করে বলে মনে হচ্ছে?
O'Rooney

1
@ ও রুনি হ্যাঁ, এটি ES6 নির্দিষ্ট।
ডোনাটস

63

আপনার সমস্যা সমাধানের জন্য আপনি নিম্নলিখিত সমাধানটি ব্যবহার করতে পারেন:

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

// returns "myFirstName"

3
এই উত্তরটি [@ SethWhite এর] (অনুরূপ stackoverflow.com/a/39669231/5876282 ) কিন্তু অনেক সরলীকৃত। ধন্যবাদ! @ ব্লুজায়াকে আমার মনে হয় এই উত্তরটি আসল গ্রহণযোগ্য উত্তরের কয়েক বছর পরে আসবে। তবে হ্যাঁ, বর্তমানে এটি সেরা - নীচে
বি চার্লস এইচ

1
ভেরিয়েবল গ্রহণ করবে এবং এর নাম মুদ্রণ করবে এমন কোনও ফাংশন তৈরি করা কি সম্ভব? আমি কোনও কোডের মধ্যে আপনার কোডটি মোড়ানোর চেষ্টা করেছি কিন্তু আইডি আমার নাম ফিরিয়ে দিয়েছে যা তর্ক হিসাবে ব্যবহৃত হয়েছিল
ওয়াকান টানকা

@ ওয়াকানট্যাঙ্কা আপনি যদি কোনও সঠিক প্রশ্ন তৈরি করেন তবে আমি সেখানে উত্তর দেব।
ফেলো অচেনা

@ ওয়াকানটানকা না, এটি কার্যকর হবে না। যেমন আপনি আবিষ্কার করেছেন, এটি কেবলমাত্র ফাংশন যুক্তি দিয়ে দেওয়া নামটি মুদ্রণ করবে। আমি মনে করি এটি দেখতে সাহায্য করে যে এই জাতীয় ফাংশনটি কীভাবে পুরানো জাভাস্ক্রিপ্টের অনুমানের সাথে সংকলন করবে। আপনি এই উদাহরণে দেখতে পারেন ( jsfiddle.net/bigpopakap/wq891ghr/2 ) যে {ভেরিয়েবল} বাক্য গঠনটি কেবল {ভেরিয়েবল: ভেরিয়েবল for এর জন্য সংক্ষিপ্ত, সুতরাং কলিং ফাংশন থেকে ভেরিয়েবলের নামটি ব্যবহার করা অসম্ভব
বিগপোপাকপ

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
দুর্দান্ত উত্তর !! অবজেক্ট ডেস্ট্রাক্টিংয়ের এই বিশেষ ব্যবহারটি আমার কাছে নতুন (লাইন ২ let nameObject = {myVar}এত দরকারী! এটি কোথাও নথিভুক্ত বলে মনে হয় না। কোনও লিঙ্ক পেয়েছে?
লরেন্স লর্ড

2
@ লরেন্সলর্ড এটিকে সম্পত্তি শর্টহ্যান্ড বলা হয়। সংজ্ঞা ছাড়াই কোনও বস্তুর সম্পত্তি অর্পণ (কিছু: 'এস্যাসিডেফ'), জেএসকে ভেরিয়েবলের নাম এবং তার মান {কিছু} === {কিছু: কিছু with দিয়ে সংজ্ঞা প্রদান করবে} aria.io/2013/02/…
শেঠহাইট

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

তবে আমি মনে করি আপনার "করিম "৯" এর মতো করা উচিত


8
এটি কেবল উইন্ডো স্কোপে কাজ করবে (কোনও ফাংশনের অভ্যন্তরে বিরতি)।
jpillora

1
সম্মত - তবে এটি ওপির প্রশ্নের উত্তর দেওয়ার সবচেয়ে নিকটতম। GJ।
ডেমবিনস্কি

এছাড়াও যদি আপনি কোনও আদিম পরীক্ষা করে যাচ্ছেন তবে এটি একই মানযুক্ত সমস্ত ভেরিয়েবলগুলিকে সতর্ক করবে, বা যদি দুটি ভেরিয়েবলের কাছে তাদের একই জিনিস বরাদ্দ করা হয়। উদাহরণস্বরূপ, যদি প্রথম লাইনটি ছিল x = 2; y = 2;বা x = {a:1}; b = x;এটি তাদের প্রত্যেককে সতর্ক করবে
aljgom 5'17

আপনি যদি এটি কোনও ফাংশন স্কোপে কাজ করতে চান var foo = function f(){ f.x = 2; for(o in f){ if(f[o]===f.x) alert(o); } }তবে উইন্ডোর পরিবর্তে ফাংশন নামটি ব্যবহার করে দেখতে চেষ্টা করতে পারেন, যেমন: তারপরে কলিং f()'x'
এলজগম

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
এটি আসলে বেশ ভাল কাজ করে! কেবলমাত্র সমস্যাটি যখন আপনি এই জাতীয় কিছুতে পাস করেন: নামোফ (())> বিকল্পগুলি.সুবপশনস.ডিসপ্লেসাইজ) যা "সাবঅপশনগুলি" প্রদান করে পরিবর্তে, আমি এই রেজেক্সটি ব্যবহার করেছি: exp.toString ()। ম্যাচ (/ (? = [। ।] * $) (\ ডাব্লু +) / ছ) [0]
জিম ব্রাউন

আমি এ থেকে অপরিবর্তিত হয়েছি: var a = {b: "c"}; সতর্কতা (নাম (ক)); ফাংশন নাম (এক্সপ্রেস) {exp.toString ()। ম্যাচ (/ (? = [^।] * *) (\ ডাব্লু +) / জি) [0]; name // নাম
ডেভিড স্পেক্টর

@ জিমব্রাউন, ধন্যবাদ! আপনার মন্তব্য উত্তর হিসাবে চিহ্নিত করা প্রয়োজন!
এভোরিওস

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
যদি মাই ফার্স্টনাম কোনও ফাংশনে (এই কোডটি ধারণ করে) আর্গুমেন্ট ভি হিসাবে পাস করা হয়, তবে ভ্যারিয়েবলনামটি মাইফার্সনামের পরিবর্তে ভি হিসাবে রিপোর্ট করা হয়।
ডেভিড স্পেক্টর

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

এটি কোনও ফাংশনে পরিণত হতে সক্ষম নয় কারণ এটি ফাংশনের ভেরিয়েবলের নাম দেয়।

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

সম্পাদনা করুন: কীভাবে এটি কোনও ফাংশনে পরিণত করা যায় তা নির্দেশ করার জন্য @ ম্যাডিয়োকে ধন্যবাদ ।

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

আপনার ভেরিয়েবলটি যুক্ত একক উপাদান অ্যারে সহ ফাংশনটি কল করতে হবে। debugVar({somefancyvariable});
সম্পাদনা: প্রতিটি ব্রাউজারে Object.keysযেমন keysআমি এটি পরীক্ষা করেছিলাম তেমনই রেফারেন্স করা যায় তবে মন্তব্য অনুসারে এটি সর্বত্র কাজ করে না।


ত্রুটি: "ভেরিয়েবল কীগুলি খুঁজে পাওয়া যায় না"
আলেকজান্ডার ভোলকভ

কী সংজ্ঞায়িত করা হয় না
avalanche1

1
এটি এর মতো হওয়া উচিত const getVarName = (v) => Object.keys(v)[0];এবং তারপরে এই ফাংশনটি কল করুনgetVarName({whatEverVariable})
ম্যাডিয়ো

6

ECMAScript 5.1 যেহেতু আপনি কোনও অবজেক্ট থেকে সমস্ত বৈশিষ্ট্যের নাম পেতে অবজেক্ট.কিগুলি ব্যবহার করতে পারেন ।

এখানে একটি উদাহরণ:

// 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

কোনও ফাংশন থাকাকালীন এমন একটি ফাংশন লিখুন যা বিভিন্ন গ্লোবাল ভেরিয়েবলের মানগুলিকে পরিবর্তন করে এটি সর্বদা মাইফিস্টনাম হয় না যা যা ঘটে তা ঘটে। এটি আমার জন্য কাজ করে দেখুন।

জেসফিডেলে চালান

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। নেট যেমন পছন্দ করেন তবে আমি মনে করি গতিশীল প্রকৃতি এবং জাভাস্ক্রিপ্টে স্থির ধরণের সিস্টেমের অভাবের কারণে এটি সম্ভব নয়।


3
আমি মনে করি না জেএস ল্যাম্বডাস বা ফাংশনাল প্রোগ্রামিং সম্পর্কিত সম্পর্কিত সরঞ্জামগুলির কম রয়েছে।

তবে আমি মনে করি। নেট মধ্যে এক্সপ্রেশন ট্রি এর সমতুল্য কোনও কাঠামো নেই।
জাহান

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"ভেরিয়েবলে পরিণত করি ।heightwindow[]


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

এটি ইন্টারনেট এক্সপ্লোরার (9, 10 এবং 11), গুগল ক্রোম 5 ব্যবহার করে কাজ করেছে:

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

ব্রাউজারের সামঞ্জস্যতা টেবিল: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / অবজেক্ট /
স্পেস


গুগল ক্রোম 5? সত্যিই ??
হিমস্রোত 1

2
@ এমএলএন সংস্করণের সামঞ্জস্যতা টেবিল অনুসারে, আভ্যালেঞ্চ 1 av
ড্যানিলো

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)ইতিমধ্যে পরিবর্তনশীল নামটি ("মাই ফার্স্টনেম") জানেন।


11
কোডটি খাটো করা হচ্ছে তবে অগত্যা সত্য নয়;)
সিক্রেট

9
উদাহরণস্বরূপ nameof(myVariable), সি # তে ব্যবহার করার বিষয়টি (যা "মাই ভার্ভেবল" স্ট্রিংটি ফিরিয়ে আনে, কোডটিতে অন্য পরিবর্তনগুলি করার সময় ভুলগুলির বিরুদ্ধে ieldাল দেওয়া A একটি সাধারণ ব্যবহারের ক্ষেত্রে হ'ল একটি ত্রুটি বার্তায় ভেরিয়েবলের নাম যুক্ত করা হয় For বেশিরভাগ অংশে আমি স্ট্রিং লিটারগুলিকে কোড গন্ধ হিসাবে বিবেচনা করি এবং সন্দেহ করে যে কেন কমপক্ষে ভিজ্যুয়াল স্টুডিওগুলি সেগুলি একটি লাল / কমলা রঙে দেখায় I আমি জানি আমি জানি, এই প্রশ্নটি জাভাস্ক্রিপ্ট সম্পর্কে, তবে আমি কেন এখানে শেষ করেছি তা ব্যাখ্যা করেছি
Merrr

var পরীক্ষা = 1235125142; কনসোল.লগ (অবজেক্ট.কিজ ({পরীক্ষা})। পপ ()) // "পরীক্ষা"
ব্লুজায়কে

1
@ ব্লুজেয়েকে আমাকে অজ্ঞতাবোধ বলুন, কিন্তু 8 বছর পরেও আমি এখনও এটি দেখতে ব্যর্থ হয়েছি যে console.log('test')এটির চেয়ে কখন কী আপনার চেয়ে বেশি দরকার বা কখন আপনার সত্য প্রয়োজন।
প্রতারণা করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.