কোন অবজেক্ট কী হিসাবে সংখ্যার প্রকারটি ব্যবহার করার কোনও উপায় আছে?


104

দেখে মনে হচ্ছে যে আমি যখন কোনও বস্তুর মূল নাম হিসাবে সংখ্যার প্রকারটি ব্যবহার করি, এটি সর্বদা একটি স্ট্রিতে রূপান্তরিত হয়। আসলে কি এটি একটি সংখ্যাসূচক হিসাবে সংরক্ষণ করা পেতে পারে? স্বাভাবিক টাইপকাস্টিং কাজ করে বলে মনে হয় না।

উদাহরণ:

var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

ডিয়ার আউটপুট:

{
    '1': 'a value'
}

আমি যা চাই তা হ'ল:

{
    1: 'a value'
}

পরামর্শ?


- এছাড়াও এই মন্তব্যটি দেখুন stackoverflow.com/questions/3633362/...
মনোহর রেড্ডি Poreddy

উত্তর:


114

না, এটি সম্ভব নয়। কীটি সর্বদা একটি স্ট্রিতে রূপান্তরিত হবে। দেখুন প্রপার্টি অ্যাকসেসর ডক্স

সম্পত্তির নাম অবশ্যই স্ট্রিং হওয়া উচিত। এর অর্থ হ'ল নন-স্ট্রিং অবজেক্টগুলিকে অবজেক্টে কী হিসাবে ব্যবহার করা যাবে না। সংখ্যাসহ যে কোনও নন-স্ট্রিং অবজেক্ট টুস্ট্রিংয়ের মাধ্যমে স্ট্রিংয়ে টাইপ করা হয়।

> var foo = {}
undefined

> foo[23213] = 'swag'
'swag'

> foo
{ '23213': 'swag' }

> typeof(Object.keys(foo)[0])
'string'

4
এটা বরং বিষয়গত। উইলিয়াম যেমন উল্লেখ করেছে, পূর্ণসংখ্যা কীগুলির জন্য আপনি তার পরিবর্তে একটি অ্যারে ব্যবহার করতে পারেন। বেশিরভাগ জেএস ইঞ্জিনগুলি পর্দার আড়ালে বিরল অ্যারে ব্যবহার করতে পারে।
ম্যাথু ফ্ল্যাশেন

8
এমনকি একটি অ্যারেতেও সমস্ত সম্পত্তির নাম স্ট্রিংয়ে রূপান্তরিত হয়।
টিম ডাউন

4
@ রোমের -1888: না, তা নয়। পার্থক্যটি হ'ল অ্যারেতে একটি সংখ্যাসম্য সম্পত্তি অর্পণ করা অ্যারের সম্পত্তিকে প্রভাবিত করে length
টিম ডাউন

4
@ টিমডাউন, এবং আমি যা বলছি তা হ'ল আপনি ভুল। "অ্যারেতে একটি সংখ্যার সম্পত্তি সেট করা দৈর্ঘ্যের সম্পত্তিকে প্রভাবিত করতে পারে" একটি ভুল বিবৃতি। জাভাস্ক্রিপ্ট অ্যারে বৈশিষ্ট্য অ্যারে উপাদানগুলি থেকে সম্পূর্ণ স্বতন্ত্র। কি মানুষ বিভ্রান্ত যে মিশুক সিনট্যাক্স হয়, যেমন myArray["1"] = foo, মনে হচ্ছে, একটি সম্পত্তি সেটিং করতে হবে, যেহেতু এটা আসলে একটি অ্যারের উপাদান সেট করে, কিন্তু শুধুমাত্র কারণ "1" একটি পূর্ণসংখ্যা, যা সম্পূর্ণ ভাষাগত আজেবাজে কথা হয় একটি স্ট্রিং উপস্থাপনা - কিন্তু জাভাস্ক্রিপ্ট যে।
রোমের -1888

4
@ রোমের -1888: "জাভাস্ক্রিপ্ট অ্যারে বৈশিষ্ট্যগুলি অ্যারে উপাদানগুলির থেকে সম্পূর্ণ স্বতন্ত্র" একটি ভুল বিবৃতি। myArray["1"] = fooকেবল কোনও সম্পত্তি সেট করা হিসাবে দেখা যাচ্ছে না, এটি সম্পত্তির সংজ্ঞাটির প্রতিটি অর্থে প্রকৃতপক্ষে একটি সম্পত্তি সেট করা (একটি কী "1" সহ) স্থাপন করা। যেমন, myArray.hasOwnProperty("1")ফলন true। শব্দার্থকভাবে, এই সম্পত্তিটিকে একটি সংখ্যার কী থাকার কারণেও "উপাদান" হিসাবে বিবেচনা করা যেতে পারে, তবে আর কিছু নেই যা অ্যারে সম্পত্তি থেকে অ্যারে "উপাদান" কে আলাদা করে। অনুমান পড়ুন। আপনি যদি এখনও একমত না হন তবে দয়া করে আপনার উত্সটি উদ্ধৃত করুন।
হ্যান্স

27

কোনও বস্তুতে, না, তবে আমি এই অ্যাপ্লিকেশনটির জন্য মানচিত্রটি অত্যন্ত দরকারী বলে খুঁজে পেয়েছি । আমি এখানে এটি কী-ভিত্তিক ইভেন্ট, সংখ্যা কীগুলির জন্য ব্যবহার করেছি।

onKeydown(e) {
  const { toggleSidebar, next, previous } = this.props;

  const keyMapping = new Map([
    [ 83, toggleSidebar ],  // user presses the s button
    [ 37, next          ],  // user presses the right arrow
    [ 39, previous      ]   // user presses the left arrow
  ]);

  if (keyMapping.has(e.which)) {
    e.preventDefault();
    keyMapping.get(e.which)();
  }
}

4
101 এর মার্জিত লুডুমদারের এন্ট্রি! +1
কায়সার

11

ECMA-262-5 এ নকশা দ্বারা প্রদর্শিত হবে:

সম্পত্তি আইডেন্টিফায়ার টাইপটি সম্পত্তি বর্ণনার সাথে কোনও সম্পত্তির নাম সংযুক্ত করতে ব্যবহৃত হয়। প্রপার্টি আইডেন্টিফায়ার প্রকারের মানগুলি ফর্মের (জোড়া নাম, বর্ণনাকারী) জোড়া, যেখানে নাম একটি স্ট্রিং এবং বর্ণনাকারী একটি সম্পত্তি বর্ণনাকারী মান।

তবে, আমি এটির জন্য একটি নির্দিষ্ট স্পেসিফিকেশন ECMA-262-3 এ দেখতে পাচ্ছি না। নির্বিশেষে, আমি সম্পত্তিটির নাম হিসাবে অ-স্ট্রিংগুলি ব্যবহার করার চেষ্টা করব না।


2

আমাদের কি এরকম কিছু দরকার?

var userId = 1;var myObject ={};
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

কনসোল: অবজেক্ট

1: "একটি মান"


0

আমি মনে করি আপনি যদি উপরের জিনিসটি একটি সংখ্যার মতো অ্যাক্সেসের জন্য ব্যবহার করতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন, আমিও তাই করেছি এবং কাজ করেছি।

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key))){
          return true; //continue;
     }
     //Code to perform operation
}

এটি কেবল তখনই কাজ করে যখন কীটি সংখ্যাটি এবং অক্ষর দিয়ে শুরু না হয় অন্যথায় এটি কোনও সংখ্যায় রূপান্তরিত হবে। নিম্নলিখিত উদাহরণটি দেখুন:

parseInt("45kjghk") === 45

আমি এখানে jQuery ব্যবহার করেছি


আপডেট হয়েছে:

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key)) || (key.length !== parseInt(key).toString().length) ){
          return true; //continue;
     }
     //Code to perform operation
}

এটি উপরের সমস্যাটি কাটিয়ে উঠতে পারে। দয়া করে উপলব্ধ থাকলে আরও ভাল পরামর্শ দিন এবং যদি এই উত্তরটি থাকে তবে সমস্যা আছে।


-3

জাভাস্ক্রিপ্টে, সংখ্যাযুক্ত স্ট্রিং এবং সংখ্যাগুলি বিনিময়যোগ্য, তাই

myObject[1] == myObject['1']

আপনি যদি কোনও বস্তুর জন্য নম্বরটি সত্যই চান তবে আপনি একটি অ্যারে (অর্থাত্‍ এর সাথে তৈরি new Array()বা তৈরি []) চাইবেন ।


4
প্রতিক্রিয়াটির জন্য ধন্যবাদ তবে এটি সম্পূর্ণ সঠিক নয়। একটি সংখ্যার শুধুমাত্র একটি টাইপফ থেকে 'সংখ্যা' হিসাবে ফিরে আসবে, এবং স্ট্রিং সহ বিপরীতে।
স্পট

@ উইলিয়াম 'সংখ্যার স্ট্রিং এবং সংখ্যাগুলি বিনিময়যোগ্য' কেবল সঠিক নয়। নাম্বার হল নাম্বার এবং স্ট্রিং স্ট্রিংস। Object.prototype.toString.call(someObject)সমস্যাটি দেখুন আপনি কী হিসাবে কোনও সংখ্যা ব্যবহার করতে পারবেন না।
মাইকমেকানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.