জাভাস্ক্রিপ্ট অ্যারেতে নেতিবাচক সূচিগুলি অ্যারের দৈর্ঘ্যে অবদান রাখতে পারে?


85

জাভাস্ক্রিপ্টে আমি এর মতো একটি অ্যারে সংজ্ঞায়িত করি

var arr = [1,2,3];

আমিও করতে পারি

arr[-1] = 4;

এখন যদি আমি করি

arr = undefined;

আমি অ্যারেতে মানটির রেফারেন্সও হারিয়েছি [-1]

সুতরাং আমার পক্ষে যৌক্তিকভাবে এটির মতো মনে হয় [-1] এটিও আরআর একটি অংশ ।

তবে আমি যখন অনুসরণ করি (আরআর সেট করে না দিয়ে)

arr.length;

এটি 3 নয় 4 প্রদান করে ;

সুতরাং আমার বক্তব্যটি হ'ল যদি অ্যারেগুলি নেতিবাচক সূচকগুলির সাথে ব্যবহার করা যায় তবে এই নেতিবাচক সূচকগুলিও তাদের দৈর্ঘ্যের একটি অংশ হওয়া উচিত **। আমি জানি না আমি ভুল হতে পারি বা অ্যারে সম্পর্কে আমার ধারণাটি অনুপস্থিত হতে পারে।


আপনি কেন একটি নেতিবাচক সূচক ব্যবহার করতে চান? আমি কিছু মিস না করা পর্যন্ত আমি বিন্দুটি দেখতে পাচ্ছি না।
এলক্ল্যানাররা

11
আপনি লিখতেও পারেন এবং arr[1.5] = 1এটি দৈর্ঘ্যকেও প্রভাবিত করে না। দৈর্ঘ্য কী প্রভাবিত করে সে সম্পর্কে ভাষার স্পেসিফিকেশন খুব স্পষ্ট। আপনি এটি পছন্দ নাও করতে পারেন তবে এটির সাথে আপনাকে থাকতে হবে। হয় তা বা আপনার নিজস্ব প্রতিযোগিতামূলক ভাষা ডিজাইন করুন এবং লোককে এতে স্যুইচ করতে রাজি করুন।
রেমন্ড চেন

4
@ দিগ্বিজয়যাদব: জাভাস্ক্রিপ্টে অন্যান্য অনেক কিছুর মতো ত্রুটি বা বৈশিষ্ট্য হিসাবে বিবেচনা করা যেতে পারে। এর কারণ অ্যারেগুলি কিছুটা অবজেক্টের মতো আচরণ করে, আপনি একটি স্ট্রিংও ব্যবহার করতে পারেন var a = []; a['foo'] = 'baz'তবে এর অর্থ এই নয় যে আপনার উচিত; এটি পরিষ্কারভাবে সমস্ত কনভেনশনের বিরুদ্ধে against
এলক্ল্যানাররা

4
ছেলেরা, এখানে মূল কথাটি হ'ল অ্যারেগুলি বিষয়গুলি। এখানে কোন পার্থক্য নেই. এই আচরণের কারণ এটি এবং আপনার পছন্দ না হলেও এটি সম্পূর্ণ ইচ্ছাকৃত। আপনি যতক্ষণ না শিখবেন যতক্ষণ না সমস্ত নম্বর ভাসমান বিন্দু, এমনকি পূর্ণসংখ্যার হিসাবে উপস্থাপিত হয়। জাভাস্ক্রিপ্ট একটি কৌতূহলী ভাষা ...
টনি আর

4
আপনি নির্দিষ্টকরণে অ্যারে উপাদানগুলির সেটিংকে সংজ্ঞায়িত করে অ্যালগরিদমের বিশদটি পেতে পারেন: es5.github.com/#x15.4.5.1.( বিশেষত পদক্ষেপ 4) এবং "অ্যারে সূচক" এখানে সংজ্ঞায়িত করা হয়েছে: es5.github.com /#x15.4
ফেলিক্স ক্লিং

উত্তর:


111

সুতরাং আমার পক্ষে যৌক্তিকভাবে এটির মতো মনে হয় [-1] এটিও আরআর একটি অংশ।

হ্যাঁ এটি হ'ল, তবে আপনি যেভাবে ভাবেন সেভাবে নয়।

আপনি অ্যারেতে নির্বিচার বৈশিষ্ট্যগুলি নির্ধারণ করতে পারেন (জাভাস্ক্রিপ্টে অন্য কোনও অবজেক্টের মতো), আপনি যখন অ্যারেতে "সূচীকরণ" করেন -1এবং একটি মূল্য নির্ধারণ করেন তখন আপনি যা করছেন । যেহেতু এটি অ্যারের সদস্য নয় এবং কেবল একটি স্বেচ্ছাসেবী সম্পত্তি তাই আপনার lengthএই সম্পত্তিটি বিবেচনা করার আশা করা উচিত নয় ।

অন্য কথায়, নিম্নলিখিত কোডটি একই কাজ করে:

var arr = [1, 2, 3];

​arr.cookies = 4;

alert(arr.length) // 3;

31
ঠিক আছে, এর অর্থ নেতিবাচক সূচকগুলি প্রকৃত সূচকগুলির মতো কাজ করে না।
me_digvijay

4
ঠিক আছে, এরা অ্যারেতে কেবল নির্বিচার বৈশিষ্ট্য।
অ্যান্ড্রু হুইটেকার

তবে আমি যদি ধনাত্মক সূচকগুলি বৈশিষ্ট্য হিসাবে সূচিগুলির মতো ব্যবহার করতে চাই না এবং আমি চাই না যে তারা অ্যারের দৈর্ঘ্যে অবদান রাখুক?
me_digvijay

7
তারপরে কোনও অ্যারে ব্যবহার করবেন না, একটি সরল ওল 'অবজেক্ট ব্যবহার করুন। তবে সেক্ষেত্রে আপনি বিল্ট ইন lengthপ্রপার্টি হারাবেন ।
অ্যান্ড্রু হুইটেকার

4
@ দিগ্বিজয়: কনসোলটি কেবল ধনাত্মক পূর্ণসংখ্যার নাম সহ বৈশিষ্ট্যগুলি দেখায় কারণ (আমি ধরে নিই) এটি কেবলমাত্র একটি সাধারণ forলুপ থেকে শুরু 0করে .length। কি console.dir(arr)সম্পূর্ণ বস্তুর দেখতে। এছাড়াও, অ্যারে অ্যাক্সেস করতে ব্র্যাকেট স্বরলিপি ব্যবহার করা অ্যারেগুলির বৈশিষ্ট্য নয়, এটি বস্তুর অন্তর্নিহিত বৈশিষ্ট্য ( var obj = {foo: 'bar'}; obj.foo or obj['foo'])।
ফেলিক্স ক্লিং

25

lengthসম্পত্তি একটি এক নম্বর সর্বোচ্চ বরাদ্দ "সূচক", যেখানে এরে "ইনডেক্স" তার চেয়ে অনেক বেশী পূর্ণসংখ্যা বা শূন্য সমান বেশী ফিরে আসবে। নোট করুন যে জেএস "স্পার্স" অ্যারেগুলিকে অনুমতি দেয়:

var someArray = [];
someArray[10] = "whatever";
console.log(someArray.length); // "11"

অবশ্যই যদি কোনও উপাদান না থাকে তবে lengthহয় 0lengthআপনি deleteসর্বাধিক উপাদান অপসারণ করতে ব্যবহার করেন তবে আপডেট হয় না তাও নোট করুন ।

তবে অ্যারেগুলি হ'ল বস্তু, তাই আপনি arণাত্মক সংখ্যা বা ভগ্নাংশ সহ অন্যান্য স্বেচ্ছাসেবী সম্পত্তি নামের সম্পত্তি যুক্ত করতে পারেন:

someArray[-1] = "A property";
someArray[3.1415] = "Vaguely Pi";
someArray["test"] = "Whatever";

নোট করুন যে নেপথ্যের নেপথ্যে জেএস সম্পত্তি নামগুলি স্ট্রিংয়ে রূপান্তর করে এমনকি আপনি কোনও সংখ্যক সরবরাহ করার পরেও -1। (ইতিবাচক পূর্ণসংখ্যার সূচকগুলিও সে ক্ষেত্রে স্ট্রিং হয়ে যায়))

এরে পদ্ধতি, মত .pop(), .slice()ইত্যাদি, শূন্য-অর-উচ্চ পূর্ণসংখ্যা "ইনডেক্স", অন্যান্য বৈশিষ্ট্য উপর না শুধুমাত্র কাজ, তাই lengthযে বিন্দুতে সামঞ্জস্যপূর্ণ।


ধন্যবাদ আপনার উত্তর অনেক সাহায্য করেছে। এছাড়াও আমি নেতিবাচক সূচকের সাথে স্প্লাইস পদ্ধতিটি চেষ্টা করে দেখেছি যে আমি যদি -1 ব্যবহার করি তবে এটি অ্যারের শেষ উপাদানটিতে চলে যায়, -2 দ্বিতীয় শেষ উপাদানটিতে যায় এবং আরও কিছু ক্ষেত্রে।
me_digvijay

+1 দৈর্ঘ্য আপনাকে জানায় না যে সেখানে কতগুলি উপাদান রয়েছে বা কতগুলি বৈশিষ্ট্য রয়েছে। এটি কেবলমাত্র সর্বোচ্চ সূচক + ১. যেমন প্রদত্ত var a = new Array(9), aএর দৈর্ঘ্য 9 এবং কোনও উপাদান নেই।
রবজি

4
@ দিগ্বিজয় যাদব - হ্যাঁ, Array.slice()পদ্ধতিটি এমনটি করার কথা। String.slice()পদ্ধতি একই জিনিস আছে।
nnnnnn

7

মনে রাখবেন যে আপনি যখন কোনও অবস্থান (বা 0) সূচক ব্যবহার করেন, মানগুলি অ্যারের মধ্যে রাখা হয়:

var array = [];

array[0] = "Foo";
array[1] = "Bar";

// Result: ["Foo", "Bar"]
// Length: 2

আপনি যখন সূচি-বহির্ভুত মানগুলি (0-9 + নয়) যোগ করেন তখন এটি হয় না:

var array = [];

array[0]  = "Foo";
array[1]  = "Bar";
array[-1] = "Fizzbuzz"; // Not a proper array index - kill it

// Result: ["Foo", "Bar"]
// Length: 2

আপনি যখন নিয়মগুলি দ্বারা খেলেন তখন মানগুলিকে কেবল অ্যারেতে রাখা হয়। আপনি যখন করবেন না, সেগুলি গ্রহণ করা হয় না। তবে এগুলি নিজেই অ্যারে অবজেক্টে স্বীকৃত, যা জাভাস্ক্রিপ্টে ঠিক যে কোনও কিছুর ক্ষেত্রে। যদিও ["Foo", "Bar"]আমাদের অ্যারেতে একমাত্র মান রয়েছে তবে আমরা এখনও অ্যাক্সেস করতে পারি "Fizzbuzz":

array[-1]; // "Fizzbuzz"

তবে আবার লক্ষ করুন যে এটি অ্যারে মানের অংশ নয়, কারণ এর "সূচক" বৈধ নয়। এটি পরিবর্তে অ্যারেটিতে কেবল অন্য সদস্য হিসাবে যুক্ত করা হয়েছিল। আমরা একই ফ্যাশনে অন্য অ্যারে সদস্যদের অ্যাক্সেস করতে পারি:

array["pop"]; // function pop() { [native code] }

এখানে নোট করুন যে আমরা popঅ্যারেতে পদ্ধতিটি অ্যাক্সেস করছি , যা আমাদের জানায় যে এতে নেটিভ কোড রয়েছে। আমরা "পপ" এর কী দিয়ে অ্যারে মানগুলির কোনওটিই অ্যাক্সেস করছি না, বরং অ্যারে অবজেক্টে নিজেই একজন সদস্য। আমরা অবজেক্টের সর্বজনীন সদস্যদের উপর সাইকেল চালিয়ে এটি আরও নিশ্চিত করতে পারি:

for (var prop in array) 
    console.log(prop, array[prop]);

যা নীচে ছিটকে:

 0 Foo
 1 Bar
-1 Fizzbuzz

তাই আবার, এটা উপর বস্তু , কিন্তু এটা না যে অ্যারে

অসাধারণ প্রশ্ন! নিশ্চিত হয়ে আমাকে ডাবল-টেক করার কারণ দিয়েছে।


4
+1 এমনকি স্পেসিফিকেশনটিতে বলা হয়েছে যে একটি ধনাত্মক সংখ্যাসম্য সম্পত্তি নামের বৈশিষ্ট্যগুলিকে অ্যারের উপাদানগুলি বলা হয় (এবং অন্য কোনও সম্পত্তি এটি নয়): es5.github.com/#x15.4
ফেলিক্স ক্লিং

ফলাফলটি নয়: ["Foo", "Bar"]তবে এখানে ফ্রেড["Foo", "Bar", -1: "Fizzbuzz"] পরীক্ষা করুন । আপনি যেমন লিখেছেন এটি কী -1 সহ একটি সম্পত্তি হয়ে যায় তবে আউটপুটে এটি অবশ্যই দৃশ্যমান। অন্যথায় আপনার উত্তরটি সুন্দর এবং সম্পূর্ণ। আপনি যদি পরিবর্তন করেন তবে আমি আবার উপচে পড়ব, আমার ডাউনভোটটি কঠোর ছিল, তবে এটি সরাতে পারবেন না; সময় শেষ.
উইল্ট

5

আপনি যদি সত্যিই negativeণাত্মক সূচকগুলি এবং অন্যান্য সূচীগুলিকে দৈর্ঘ্যের অন্তর্ভুক্ত করতে চান তবে কার্যকারিতা নিজেই তৈরি করুন:

function getExtendedArray() {
    var a = [];

    Object.defineProperty(a, 'totalLength', { 
        get : function() { return Object.keys(a).length; }
    });

    return a;
}

তারপরে উদাহরণস্বরূপ:

var myArray = getExtendedArray();
console.log(myArray.totalLength); // 0
myArray.push("asdf");
myArray[-2] = "some string";
myArray[1.7777] = "other string";
console.log(myArray.totalLength); // 3

এবং আপনি যদি দৈর্ঘ্যটি কেবল সংখ্যাযুক্ত সূচক / বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করতে চান তবে আপনি কীটির জন্য একটি বিবৃতি যুক্ত করতে পারেন - if(Number(key) != NaN) length++;আপনি যদি && key % 1 == 0
ভাসমানগুলি

4

জেএসে অ্যারে কেবল একটি বিশেষ ধরণের অবজেক্ট । একটি বিশেষ বাক্য গঠন আছে, যা ভাল, কারণ এটি আমাদের তাদের সাথে কার্যকরভাবে কাজ করতে দেয়। ভাবুন যে এভাবে অ্যারে আক্ষরিক লেখা কতটা ক্লান্তিকর হবে:

const array = {0: 'foo', 1: 'bar', 2: 'baz'} //etc...

তবে তারা তবুও বস্তু । সুতরাং আপনি যদি:

const myArray = [42, 'foo', 'bar', 'baz'];

myArray[-1] = 'I am not here';
myArray['whatever'] = 'Hello World';

এই অ-পূর্ণসংখ্যা বৈশিষ্ট্যগুলিকে কোনও বস্তুর সাথে সংযুক্ত করা হবে (যা অ্যারে হয়) তবে কিছু দেশীয় পদ্ধতিতে যেমন অ্যাক্সেসযোগ্য নয় Array.length

আপনি অনুমান করতে পারেন নেটিভ 'দৈর্ঘ্য' পদ্ধতি একটি সংগ্রহকারী যা সব সম্পত্তি, মোট ছাত্র (এবং ইনডেক্স হয় যখন মান প্রকৃত হয়, বৈশিষ্ট্য মান ) ধনাত্মক পূর্ণসংখ্যা বা শূন্য পরিবর্তনীয়। এই ছদ্ম-প্রয়োগের মতো কিছু:

দরুন চশমা , নেটিভ lengthপদ্ধতি - একটি হিসাবে সংগ্রহকারী ( exampleArray.length) - সব 'নন-নেগেটিভ পূর্ণসংখ্যা কম 2 চেয়ে চেক করবে 32 ' কি, সবচেয়ে বড় এক পেতে এবং তার সাংখ্যিক মান +1 ফিরে যান।

সেটটার ( exampleArray.length = 42) হিসাবে , এটি যদি 'অনুপস্থিত' সূচকগুলির জন্য কিছু খালি স্লট তৈরি করে তবে প্রদত্ত দৈর্ঘ্য যদি নন-নেগেটিভ পূর্ণসংখ্য কীগুলির আসল সংখ্যার চেয়ে বেশি হয় বা সমস্ত নন-নেগেটিভ পূর্ণসংখ্যা কী (এবং তাদের মান) মুছে দেয় যা এর চেয়ে বেশি নয় প্রদত্ত দৈর্ঘ্য

সিউডো-বাস্তবায়ন:

const myArray = {
  '-1': 'I am not here', // I have to use apostrophes to avoid syntax error
  0: 42,
  1: 'foo',
  2: 'bar',
  3: 'baz',
  whatever: 'Hello World',

  get myLength() {
    let highestIndex = -1;
    for (let key in this) {
      let toInt = parseInt(key, 10);
      if (!Number.isNaN(toInt) && toInt > -1) {
        // If you're not an integer, that's not your business! Back off!
        if (toInt > highestIndex) highestIndex = toInt;
      }
    }
    return highestIndex + 1;
  },
  set myLength(newLength) {
    /* This setter would either:
      1) create some empty slots for 'missing' indices if the given length is greater than the actual number of non-negative-integer keys
      2) delete all non-negative-integer keys (and their values) which are not greater then the given length.
    */
  }
}

console.log(myArray.myLength); // 4

myArray[9] = 'foobar';

console.log(myArray.myLength); // 10


3

জাভাস্ক্রিপ্টে অ্যারেগুলি আসলে অবজেক্ট। এরা অ্যারে কনস্ট্রাক্টর থেকে কেবল প্রোটোটাইপড।

অ্যারে সূচকগুলি হ্যাশম্যাপে আসলে কী এবং সমস্ত কীগুলি স্ট্রিংয়ে রূপান্তরিত হয়। আপনি যে কোনও কী (যেমন "-1") তৈরি করতে পারেন, তবে অ্যারেতে পদ্ধতিগুলি অ্যারের মতো কাজ করার জন্য উপযুক্ত। সুতরাং lengthবস্তুর আকার নয়, এটি কেবল বৃহত্তম সংখ্যার সূচকগুলির চেয়ে বড় হওয়ার গ্যারান্টিযুক্ত। একইভাবে, মুদ্রণ arrকেবলমাত্র পূর্ণসংখ্য কী> = 0 দিয়ে মান তালিকাভুক্ত করবে।

আরও তথ্য এখানে।


ঠিক অথবা আমরা ভাবতে শুরু করতে পারি যে অ্যারে ['foo'] একটি বৈধ সূচক নয় কেন - জাভাস্ক্রিপ্ট আপনাকে এটি করতে দেয় তবে এর অর্থ এই নয় যে কোনও অ্যারে (এবং এর উপাদানগুলি) এক ভাষা থেকে অন্য ভাষায় কী বদলে যায় তার সংজ্ঞা। উদ্দেশ্য হিসাবে কাজ।
tw এয়ারবল

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

4
অ্যারে এবং প্লেইন অবজেক্টগুলির মধ্যে একটি খুব বিশেষ পার্থক্য রয়েছে: স্ব-সামঞ্জস্য করা দৈর্ঘ্যের সম্পত্তি।
রবজি

1

এমডিএন অনুসারে:

দৈর্ঘ্যের সম্পত্তির মান হ'ল ধনাত্মক চিহ্ন সহ একটি পূর্ণসংখ্যা এবং 32 পাওয়ারের চেয়ে কম (232) মান

জাভাস্ক্রিপ্টে আপনি যে কোনও বস্তু তৈরি করে তার উপর একটি সম্পত্তি সেট করতে পারেন।

var array = new Array();
array = [1,2,3];
array["boom"] = "pow";

একইভাবে আপনি যখন কোনও নেতিবাচক সূচক সেট করেন তখন এটি সূচকের অংশের চেয়ে অ্যারেতে সম্পত্তি হিসাবে সঞ্চয় করে।

array[-1] = "property does not add to array length";

এ কারণেই দৈর্ঘ্যটি এটি প্রতিফলিত করে না তবে একটি for..in লুপ এটি দেখায়।


-1

আপনি যখন অ-ধনাত্মক বা অ-সংখ্যাসূচক সূচকগুলি ব্যবহার করেন তখন অ্যারেটি একটি এসোসিয়েটিভ অ্যারে হিসাবে আচরণ করে যার কী-মান জোড়া রয়েছে।

অ্যারের মাধ্যমে পুনরাবৃত্তি করতে আপনি ব্যবহার করতে পারেন

for(var index in myArray) {
  document.write( index + " : " + myArray[index] + "<br />");
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.