কীভাবে জাভাস্ক্রিপ্টে অ্যারের দৈর্ঘ্য সূচনা করবেন?


541

টিউটোরিয়াল যে আমি জাভাস্ক্রিপ্ট মধ্যে অ্যারে (সহ পড়েছি অধিকাংশই W3Schools এবং devguru ) পরামর্শ অনুযায়ী আপনি এরে কন্সট্রাকটর একটি পূর্ণসংখ্যা ক্ষণস্থায়ী ব্যবহার করে একটি নির্দিষ্ট দৈর্ঘ্য সহ একটি বিন্যাস আরম্ভ করতে পারেন var test = new Array(4);সিনট্যাক্স।

আমার জেএস ফাইলগুলিতে এই সিনট্যাক্সটি উদারভাবে ব্যবহার করার পরে, আমি জেএসলিন্টের মাধ্যমে একটি ফাইল চালিয়েছি এবং এটি ফাঁস হয়ে গেছে:

ত্রুটি: লাইন 1 অক্ষর 22 তে সমস্যা: প্রত্যাশিত ')' এবং এর পরিবর্তে '4' দেখেছি।
var পরীক্ষা = নতুন অ্যারে (4);
লাইন 1 অক্ষর 23 তে সমস্যা: প্রত্যাশিত ';' এবং পরিবর্তে দেখেছি ')'।
var পরীক্ষা = নতুন অ্যারে (4);
লাইন 1 অক্ষর 23 তে সমস্যা: একটি সনাক্তকারী এবং তার পরিবর্তে ') দেখেছি Exp

JsLint এর আচরণের ব্যাখ্যাটি পড়ার পরে , দেখে মনে হচ্ছে জেএসলিন্টটি new Array()সিনট্যাক্সটি সত্যিই পছন্দ করে না এবং []অ্যারেগুলি ঘোষণাকালে পরিবর্তে পছন্দ করে।

সুতরাং আমার কয়েকটি প্রশ্ন আছে:

প্রথম, কেন? আমি কি new Array()পরিবর্তে সিনট্যাক্স ব্যবহার করে কোনও ঝুঁকি নিয়ে চলেছি? ব্রাউজারের এমন অসম্পূর্ণতা রয়েছে যা সম্পর্কে আমার সচেতন হওয়া উচিত?

এবং দ্বিতীয়ত, আমি বর্গাকার বন্ধনী সিনট্যাক্সে স্যুইচ করি, কোনও অ্যারে ঘোষণা করার এবং এর দৈর্ঘ্যকে এক লাইনে সেট করার কোনও উপায় আছে, বা আমাকে এরকম কিছু করতে হবে:

var test = [];
test.length = 4;

স্ট্যান্ডার্ড জেএস সাধারণভাবেব্যবহারের বিরুদ্ধেও পরামর্শ দেয়new Array() তবে আকার নির্দিষ্ট করার সাথে এটি ঠিক আছে। আমি মনে করি এটি পুরো প্রসঙ্গের মাধ্যমে কোডের ধারাবাহিকতায় নেমে আসে।
ক্রেগোক্স

যারা আরও কঠোর অ্যারে স্ট্রাকচারগুলি পূর্বনির্ধারণ করতে চান তাদের জন্য টাইপড অ্যারে রয়েছে । নোট করুন যে পারফরম্যান্সের সুবিধাগুলি পরিবর্তিত হতে পারে
রোভিকো

উত্তর:


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

  2. jsLint পছন্দ করেন না new Array()কারণ নির্মাতা অস্পষ্ট।

    new Array(4);

    দৈর্ঘ্যের একটি ফাঁকা অ্যারে তৈরি করে 4 তবে

    new Array('4');

    মান সহ একটি অ্যারে তৈরি করে '4'

আপনার মন্তব্য সম্পর্কে: জেএসে আপনাকে অ্যারের দৈর্ঘ্য আরম্ভ করার দরকার নেই। এটি গতিশীলভাবে বৃদ্ধি পায়। আপনি দৈর্ঘ্য কিছু ভেরিয়েবলের মধ্যে সঞ্চয় করতে পারেন, যেমন

var data = [];
var length = 5; // user defined length

for(var i = 0; i < length; i++) {
    data.push(createSomeObject());
}

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

4
@ এমএমএস কেবল অ্যারের দৈর্ঘ্য নির্ধারণ না করে তার পরিবর্তে ব্যবহারকারী-সংজ্ঞায়িত সংখ্যাটির জন্য লুপটি পুনরাবৃত্তি করতে দিন এবং তারপরে এটি পুনরাবৃত্তি করুন। এটি কি আপনার আরও অর্থবোধ করে না?
Vidime Vidas

149
<blockquote> আপনি দৈর্ঘ্যটি আরম্ভ করতে চান কেন? তাত্ত্বিকভাবে এটির জন্য কোনও প্রয়োজন নেই। এবং অ্যারেটি খালি আছে কিনা তা নির্ধারণের জন্য দৈর্ঘ্যটি ব্যবহার করে এমন সমস্ত পরীক্ষাগুলি ব্যর্থ হবে </ </ ব্লককোটি> উম, সম্পাদনা সম্ভবত? একটি অ্যারের পূর্ব-বিদ্যমান উপাদানটি উড়ে যাওয়ার তুলনায় সেট করা আরও দ্রুত।
কোডহেড

43
"পুরানো প্রোগ্রামিং অভ্যাস ছেড়ে দেওয়ার সময়" মন্তব্যটি সত্যই অপ্রয়োজনীয়। সঠিকভাবে কাঠামোগত ভাষাগুলি সর্বদা বাস্তু স্ক্রিপ্ট ম্যাম্বো জাম্বোকে ছাড়িয়ে যাবে
ব্যবহারকারী 151496

10
@ কোডেড: এই উদ্ধৃতিটির প্রতিক্রিয়াতে: "একটি অ্যারের পূর্ব-বিদ্যমান উপাদানটিকে উড়তে যোগ করার চেয়ে সেট করা আরও দ্রুত।": দ্রষ্টব্য যে new Array(10)10 অপরিবর্তিত উপাদান দিয়ে অ্যারে তৈরি করে না। এটা শুধু 10 একটি দৈর্ঘ্য সহ একটি খালি অ্যারে তৈরি করে কদর্য সত্যের এই উত্তরটি দেখুন: stackoverflow.com/questions/18947892/...
Milimetric

595
  • Array(5) আপনাকে দৈর্ঘ্য 5 সহ একটি অ্যারে দেয় তবে কোনও মান নেই, সুতরাং আপনি এটির উপরে পুনরাবৃত্তি করতে পারবেন না।

  • Array.apply(null, Array(5)).map(function () {}) আপনাকে 5 টি দৈর্ঘ্যের এবং একটি মান হিসাবে নির্ধারিত অ্যারে দেয়, এখন এটি পুনরাবৃত্তি হতে পারে।

  • Array.apply(null, Array(5)).map(function (x, i) { return i; }) আপনাকে দৈর্ঘ্য 5 এবং 0,1,2,3,4 মান সহ একটি অ্যারে দেয়।

  • Array(5).forEach(alert)কিছুই করে না, Array.apply(null, Array(5)).forEach(alert)আপনাকে 5 টি সতর্কতা দেয়

  • ES6আমাদের Array.fromএখন তাই আপনি ব্যবহার করতে পারেন দেয়Array.from(Array(5)).forEach(alert)

  • আপনি যদি একটি নির্দিষ্ট মান দিয়ে আরম্ভ করতে চান তবে এগুলি জানা ভাল ...
    Array.from('abcde'), Array.from('x'.repeat(5))
    বাArray.from({length: 5}, (v, i) => i) // gives [0, 1, 2, 3, 4]


11
এই আমি খুঁজছিলাম ছিল। আমি একটি যৌক্তিক ক্রম উপর একটি মানচিত্র প্রয়োগ করতে চেয়েছিলেন; এটি করা উচিত। ধন্যবাদ!
jedd.ahyoung

3
অ্যারে.এপ্লি () এটিকে কেন মান হিসাবে অপরিবর্তিত করে?
wdanxna

5
@wdanxna যখন Arrayএকাধিক আর্গুমেন্ট দেওয়া হয় তখন এটি argumentsবস্তুর উপরে পুনরাবৃত্তি করে এবং প্রতিটি মানকে নতুন অ্যারেতে স্পষ্টভাবে প্রয়োগ করে। আপনি যখন Array.applyঅ্যারের সাথে কল করেন বা একটি দৈর্ঘ্যের বৈশিষ্ট্যযুক্ত কোনও বস্তু দৈর্ঘ্যটি Arrayনতুন অ্যারের প্রতিটি মান স্পষ্টভাবে সেট করতে ব্যবহার করতে চলেছে। এই কারণেই Array(5)5 টি এলিজেন্সের Array.apply(null, Array(5))অ্যারে দেয় , যখন 5 টি অপরিজ্ঞাপিত এর অ্যারে দেয়। আরও তথ্যের জন্য, এই উত্তর দেখুন।
কাইলপ্লাস প্লাস

2
অ্যারে (5) এবং নতুন অ্যারে (5) এর মধ্যে পার্থক্য আছে কি?
পেটর হুরতক

2
Array.apply(null, Array(5)) এছাড়াও হিসেবে লেখা যেতে পারে Array.apply(null, {length: 5})। আসলে খুব বেশি পার্থক্য নেই, তবে দ্বিতীয়টি স্পষ্টতই পরিষ্কার যে অভিপ্রায়টি একটি অ্যারে তৈরি করার জন্য length 5এবং একটি অ্যারে যুক্ত নয়5
আলেকজমোরলি-ফিঞ্চ

271

ES2015.fill() এর সাহায্যে আপনি এখন সহজভাবে এটি করতে পারেন:

// `n` is the size you want to initialize your array
// `0` is what the array will be filled with (can be any other value)
Array(n).fill(0)

যা এর চেয়ে অনেক বেশি সংক্ষিপ্ত Array.apply(0, new Array(n)).map(i => value)

এটা ড্রপ করা সম্ভব 0মধ্যে .fill()এবং আর্গুমেন্ট ছাড়াই চালানো, যার অ্যারে পূরণ হবে undefined। ( তবে এটি টাইপস্ক্রিপ্টে ব্যর্থ হবে )


1
আপনি সর্বদা ব্যবহার করতে পারে @AralRoca Polyfill MDN পৃষ্ঠাতে দেওয়া, অথবা ব্যবহার করার বিষয়ে ভাবুন Modernizr
এপি।

4
হ্যাঁ, মন্তব্য করার আগে দয়া করে চেষ্টা করে দেখুন
এপি।

1
@GarretWilson এবং @Christian এটা বৈশিষ্টWhen Array is called as a function rather than as a constructor, it also creates and initializes a new Array object. Thus the function call Array(…) is equivalent to the object creation expression new Array(…) with the same arguments
এপি।

1
@ এপি।, শূন্যটি অপ্রয়োজনীয়। করArray(n).fill()
পেসারিয়ার

2
@ পেসারিয়র আমি মনে করি না যে 0 টি অপ্রয়োজনীয় ছিল। এস type টাইপ সংজ্ঞা অনুসারে, এটি ফাংশনের স্বাক্ষর: পূরণ করুন (মান: টি, শুরু ?: সংখ্যা, শেষ ?: সংখ্যা): এটি; সুতরাং পূরণের মানটি alচ্ছিক বলে মনে হয় না। ফাংশন কল উপরে লেখা হয়েছে বলে টাইপস্ক্রিপ্ট সংকলন ব্যর্থ হবে।
মিচা সোয়াব

148
[...Array(6)].map(x => 0);
// [0, 0, 0, 0, 0, 0]

অথবা

Array(6).fill(0);
// [0, 0, 0, 0, 0, 0]

দ্রষ্টব্য: আপনি খালি স্লটগুলি লুপ করতে পারবেন না Array(4).forEach(() => …)


অথবা

( টাইপস্ক্রিপ্ট নিরাপদ )

Array(6).fill(null).map((_, i) => i);
// [0, 1, 2, 3, 4, 5]

অথবা

একটি ফাংশন ব্যবহার করে ক্লাসিক পদ্ধতি (যে কোনও ব্রাউজারে কাজ করে)

function NewArray(size) {
    var x = [];
    for (var i = 0; i < size; ++i) {
        x[i] = i;
        return x;
    }
}

var a = NewArray(10);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

নেস্টেড অ্যারে তৈরি করা হচ্ছে

যখন একটি তৈরি 2D সঙ্গে অ্যারে fill, intuitively নতুন দৃষ্টান্ত তৈরি করা উচিত। কিন্তু আসলে যা হতে চলেছে তা হ'ল একই অ্যারেটি রেফারেন্স হিসাবে সংরক্ষণ করা হবে।

var a = Array(3).fill([6]);
// [  [6], [6], [6]  ]

a[0].push(9);
// [  [6, 9], [6, 9], [6, 9]  ]

সমাধান

var a = [...Array(3)].map(x => []);

a[0].push(4, 2);
// [  [4, 2], [], []  ]

সুতরাং একটি 3x2 অ্যারে এর মতো দেখতে পাবেন:

[...Array(3)].map(x => Array(2).fill(0));
// [  [0, 0], [0, 0], [0, 0]  ]

এন-ডাইমেনশনাল অ্যারে

function NArray(...dimensions) {
    var index = 0;
    function NArrayRec(dims) {
        var first = dims[0], next = dims.slice().splice(1); 
        if(dims.length > 1) 
            return Array(dims[0]).fill(null).map((x, i) => NArrayRec(next ));
        return Array(dims[0]).fill(null).map((x, i) => (index++));
    }
    return NArrayRec(dimensions);
}

var arr = NArray(3, 2, 4);
// [   [  [ 0,  1,  2,  3 ] , [  4,  5,  6,  7]  ],
//     [  [ 8,  9,  10, 11] , [ 12, 13, 14, 15]  ],
//     [  [ 16, 17, 18, 19] , [ 20, 21, 22, 23]  ]   ]

একটি দাবা বোর্ড শুরু করুন

var Chessboard = [...Array(8)].map((x, j) => {
    return Array(8).fill(null).map((y, i) => {
        return `${String.fromCharCode(65 + i)}${8 - j}`;
    });
});

// [ [A8, B8, C8, D8, E8, F8, G8, H8],
//   [A7, B7, C7, D7, E7, F7, G7, H7],
//   [A6, B6, C6, D6, E6, F6, G6, H6],
//   [A5, B5, C5, D5, E5, F5, G5, H5],
//   [A4, B4, C4, D4, E4, F4, G4, H4],
//   [A3, B3, C3, D3, E3, F3, G3, H3],
//   [A2, B2, C2, D2, E2, F2, G2, H2],
//   [A1, B1, C1, D1, E1, F1, G1, H1] ]

1
a[0].push(9); // [ [6, 9], [6], [6] ] হওয়া উচিত a[0].push(9); // [ [6, 9], [6, 9], [6, 9] ] কারণ প্রতিটি নেস্টেড অ্যারেটি রেফারেন্স হিসাবে সঞ্চিত থাকে, সুতরাং একটি অ্যারেরকে পরিবর্তন করে বাকীটিকে প্রভাবিত করে। আপনি সম্ভবত এটি ভুল টাইপ করে থাকতে পারেন যদিও আমি মনে করি :)
অ্যালেক্স_জং

@ অ্যালেক্স_হং ট্রু যে ধন্যবাদ, এটি একটি সম্পাদনায় হারিয়েছে
ভ্লাদ

68

সবচেয়ে কম:

[...Array(1000)]

10
উত্সাহিত, তবে একটি সতর্কতামূলক, আপনি একেবারে জেএসে একটি লাইন শুরু না করা উচিত [এটি ব্যবহার না করে ;যেহেতু এটি উপরের লাইনটিকে অবজ্ঞার চেষ্টা করবে। সুতরাং কোডের যে কোনও অংশে অনুমানযোগ্যভাবে এই লাইনটি ব্যবহার করার একটি নিরাপদ উপায় হ'ল:;[...Array(1000)]//.whateverOpsNeeded()
এপি।

আসলে তা না. বিকাশকারী সরঞ্জামগুলিতে চেষ্টা করুন। [...Array(5)].map((item, index) => ({ index }))[...Array(5)]; console.log('hello');
এটিও

2
এটি একটি বহু-লাইন জেএস ফাইলে ব্যবহার করার চেষ্টা করুন। যদি আপনার প্রথম লাইন হয় const a = 'a'এবং পরের লাইনটি [...Array(5)].//irrelevent। আপনি কি মনে করেন যে প্রথম পংক্তির সমাধান হবে? এটি হতে পারে const a = 'a'[...Array(5)]যার ফলস্বরূপ:Uncaught SyntaxError: Unexpected token ...
এপি।

7
এটি সত্য তবে এই ক্ষেত্রে আমি বলব যে সমস্যাটি অন্য কোথাও রয়েছে, আজকাল সেমিকোলন এবং লিটিং গুরুত্বপূর্ণ important
মাইকেল ম্যামোলিটি

8
@ অ্যাপ্লিকেশন সেই উদাহরণটি হ'ল কারণ হ'ল বহু শৈলী নির্দেশিকা আধ্যাত্মিক অর্থে প্রতিটি বিবৃতি শেষ করে mand const a = 'a'সেক্ষেত্রে লিন্টের ত্রুটি হবে। যাইহোক, এই উত্তরটির সাথে এর আসলে কোনও সম্পর্ক নেই।
গ্রাপ করুন

41

ES6 প্রবর্তন করে Array.fromযা আপনাকে Arrayকোনও "অ্যারে-মত" বা পুনরাবৃত্ত বস্তু থেকে একটি তৈরি করতে দেয় :

Array.from({length: 10}, (x, i) => i);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

এই ক্ষেত্রে {length: 10}একটি "অ্যারে-জাতীয়" অবজেক্টের ন্যূনতম সংজ্ঞা উপস্থাপন করে : কেবলমাত্র একটি lengthসংজ্ঞা দেওয়া সম্পত্তি সহ একটি খালি অবজেক্ট ।

Array.from ফলাফলের অ্যারেতে মানচিত্রের জন্য দ্বিতীয় যুক্তির অনুমতি দেয়।


2
@dain আমি মনে করি [... এরে (10)] উত্তম stackoverflow.com/a/47929322/4137472
আলেকজান্ডার Shutau

1
কেন ভাল? অ্যারে কনস্ট্রাক্টর ব্যবহারকে নিরুৎসাহিত করা হয়েছে, এবং কিছু লিটার অভিযোগও করতে পারে
ক্রিশ্চিয়ান ট্রেনা

26

এটি দৈর্ঘ্যের বৈশিষ্ট্যটি 4 এ শুরু করবে:

var x = [,,,,];

3
যে চালাক। এটিতে কনস্ট্রাক্টরের নমনীয়তা নেই, কারণ আপনি দৈর্ঘ্য নির্ধারণ করতে কোনও ভেরিয়েবল ব্যবহার করতে পারবেন না, তবে এটি আমার প্রশ্নের উত্তর দেয় কারণ আমি এটির মূলত বাক্য গঠন করেছি, সুতরাং +1।
মাইকেল মার্টিন-স্মুকার

12
কল্পনা করুন যে 300 আইটেমের জন্য যখন পারফরম্যান্সটি সত্যই গুরুত্বপূর্ণ!
মার্কো লুগলিও

9
এত ছোট আকারের একটি অ্যারের প্রাক-পরিকল্পনা করার সময় সম্ভবত কর্মক্ষমতা অর্জন খুব বেশি নয়। বৃহত্তর অ্যারে তৈরি করার সময় পারফরম্যান্সের পার্থক্যটি আরও ভালভাবে উপলব্ধি করা হবে। এবং এই ক্ষেত্রে, কমা দিয়ে তাদের আরম্ভ করা কিছুটা অভিভূত হবে।
মার্কো লুগলিও

6
আমি মনে করি যে এই চূড়ান্ত কমা কারণ বিভিন্ন ব্রাউজারে ভিন্ন ফলাফল সমর্পণ করা হবে, কখনো কখনো 4 এবং কখনও কখনও 5, দেখতে stackoverflow.com/questions/7246618/...
jperelli

1
কীভাবে var size = 42; var myArray = eval("["+",".repeat(size)+"]");? (
তাত্পর্যপূর্ণ

15

আমি অবাক হয়েছি এমন কোনও কার্যকরী সমাধান প্রস্তাবিত হয়নি যা আপনাকে দৈর্ঘ্যে এক লাইনে সেট করতে দেয়। নীচেরগুলি অ্যান্ডস্কোরজেএস-এর উপর ভিত্তি করে:

var test = _.map(_.range(4), function () { return undefined; });
console.log(test.length);

উপরে উল্লিখিত কারণে, আমি যদি এরিটি নির্দিষ্ট মানের সাথে আরম্ভ করতে না চাই তবে আমি এটি করা এড়াতে চাই। এটি লক্ষণীয় যে এখানে অন্যান্য লাইব্রেরি রয়েছে যা লো-ড্যাশ এবং আলস্য সহ পরিসীমা বাস্তবায়ন করে, যার বিভিন্ন কার্য সম্পাদনের বৈশিষ্ট্য থাকতে পারে।


আন্ডারস্কোর কালো যাদুটির সত্যই এখানে প্রয়োজন নেই। নির্ভরতাগুলি চিনির মতো, প্রথমে এটি মিষ্টি বলে মনে হয় তবে এটি জানার আগে আপনি ডায়াবেটিস পান।
রোমেন ভিনসেন্ট

9

দয়া করে লোকেরা এখনও আপনার পুরানো অভ্যাস ত্যাগ করবেন না। মেমরি বরাদ্দকরণের পরে একবার সেই অ্যারেতে প্রবেশকারীদের (পুরানো হিসাবে) বরাদ্দকরণের মধ্যে গতিতে বড় পার্থক্য রয়েছে এবং অ্যারে বাড়ার সাথে সাথে এটি বহুবার বরাদ্দ করা হয় (যা অন্যান্য প্রস্তাবিত পদ্ধতির সাহায্যে হুডের নীচে সিস্টেমটি অনিবার্যভাবে কী করে) ।

আপনি অবশ্যই বৃহত্তর অ্যারে দিয়ে শীতল কিছু করতে না চাইলে অবশ্যই এই বিষয়গুলির কোনওটিই নয়। তারপরে তা হয়।

অ্যারেটির প্রাথমিক ক্ষমতা নির্ধারণ করার মুহূর্তে এখনও জেএসে কোনও বিকল্প নেই বলে মনে হচ্ছে, আমি নিম্নলিখিতটি ব্যবহার করি ...

var newArrayWithSize = function(size) {
  this.standard = this.standard||[];
  for (var add = size-this.standard.length; add>0; add--) {
   this.standard.push(undefined);// or whatever
  }
  return this.standard.slice(0,size);
}

এতে জড়িত ট্রেড অফস রয়েছে:

  • এই পদ্ধতিটি ফাংশনে প্রথম কল করার জন্য অন্যরা যতক্ষণ সময় নেয়, তবে পরবর্তী কলগুলির জন্য খুব কম সময় লাগে (যতক্ষণ না বড় অ্যারে না চাইতে)।
  • standardঅ্যারে স্থায়ীভাবে বৃহত্তম অ্যারের তোমার জন্য জিজ্ঞাসা যতটা স্থান হিসাবে রিজার্ভ নেই।

আপনি যদি এখানে যা করছেন তা যদি এটির সাথে খাপ খায় তবে যদি তা পরিশোধ করতে পারে। অনানুষ্ঠানিক সময় রাখে

for (var n=10000;n>0;n--) {var b = newArrayWithSize(10000);b[0]=0;}

বেশ দ্রুত গতিতে (এন = 1000000 দিয়ে এটি প্রায় 5 সেকেন্ড সময় নিয়ে 10000 এর জন্য প্রায় 50 মিমি), এবং

for (var n=10000;n>0;n--) {
  var b = [];for (var add=10000;add>0;add--) {
    b.push(undefined);
  }
}

এক মিনিটেরও বেশি সময় ধরে (একই ক্রোম কনসোলে 10000 এর জন্য প্রায় 90 সেকেন্ড, বা প্রায় 2000 বার ধীর)। এটি কেবল বরাদ্দ হবে না, তবে লুপ ইত্যাদির জন্য 10000 পুশও করবে ..


প্রতিবার অ্যারের শেষ প্রান্তে পৌঁছালে আপনি এটির সদৃশ হন তবে এন মান সন্নিবেশ করার জটিলতা এখনও ও (এন) থাকে তাই জটিলতার মধ্যে পার্থক্য নেই (তবে এটি ধীর হয়)।
টোমার ওলবার্গ

টমর ওলবার্গকে ভালভাবে ধরা হয়েছে, আমি আমার কথা বদলেছি। এটি ধরণের পদ্ধতিতে স্লাইস দ্বারা পৃথক সদস্যের সূচনা / অনুলিপিটির চেয়ে জটিলতা রয়েছে কিনা তা বিষয়। আফাইক যে তারা দুজনই ধ্রুবক সময়, খুব কমপক্ষে তারা হতে পারে তাই আমি পরিবর্তে 'গতি' শব্দটি ব্যবহার করেছি।

8

(এটি সম্ভবত একটি মন্তব্য হিসাবে ভাল ছিল, কিন্তু খুব দীর্ঘ হয়েছে)

সুতরাং, এটি পড়ার পরে আমি আগ্রহী ছিলাম যদি প্রাক-বরাদ্দটি আসলে দ্রুত হয়, কারণ তাত্ত্বিকভাবে এটি হওয়া উচিত। তবে এই ব্লগটি এর বিরুদ্ধে পরামর্শ দেওয়ার জন্য কিছু টিপস দিয়েছে http://www.html5rocks.com/en/tutorials/speed/v8/

তাই এখনও অনিশ্চিত হয়ে, আমি এটি পরীক্ষায় ফেলেছি। এবং এটি সক্রিয় হিসাবে এটি আসলে ধীর বলে মনে হচ্ছে।

var time = Date.now();
var temp = [];
for(var i=0;i<100000;i++){
    temp[i]=i;
}
console.log(Date.now()-time);


var time = Date.now();
var temp2 = new Array(100000);
for(var i=0;i<100000;i++){
    temp2[i] = i;
}
console.log(Date.now()-time); 

এই কোডটি কয়েকটি ক্যাজুয়াল রান করার পরে নিম্নলিখিতটি দেয়:

$ node main.js 
9
16
$ node main.js 
8
14
$ node main.js 
7
20
$ node main.js 
9
14
$ node main.js 
9
19

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

1
@ মাইকেলমার্টিন-স্মোকার অপেক্ষা করুন ... এর অর্থ কি ভি 8 আসলে পুরোপুরি অনুকূলিত এবং নিখুঁত নয়?!?!? : পি
জেব ম্যাককর্কল

1
@ মাইকেলমার্টিন-স্মুকার - আমি আপনার ক্রোম সংস্করণ 42.0.2311.90 এ সুনির্দিষ্টভাবে আপনার জেসস্পিফটি চালিয়েছি (নির্দিষ্ট করার জন্য - উইন্ডোজ সার্ভার ২০০৮ আর ২ / 64 -৪-বিট-এ ক্রোম ৪২.০.২৩১১.৯২ ৩২-বিট) এবং গতিশীল আকারের অ্যারে 69৯% ধীর ছিল ।
ইয়েলেন

1
পূর্বোক্ত। (আমি মূল নোড পরীক্ষাটি লিখেছি) ক্রোমটিতে 42.0.2311.90 উইন্ডোতে গতিশীল আকারের ছিল 81% ধীর :)। তবে আমাদের আসল পরীক্ষাগুলি এখন এক বছর আগে। সময়
স্লিপিন

1
চমকপ্রদ ... জাসস্পিফের ফলাফল থেকে দেখে মনে হচ্ছে যে প্রাক-বরাদ্দ হওয়া ক্রোমে 38-এ একটি বিশাল উত্সাহ পেয়েছে The ভবিষ্যতে!
মাইকেল মার্টিন-স্মুকার

8
var arr=[];
arr[5]=0;
alert("length="+arr.length); // gives 6

2
হ্যাঁ, তবে কনসোল.লগ (আরআর) দেয় [5: 0]এটি একটি বিরল অ্যারে এবং সম্ভবত যা চেয়েছিল তা নয়।
dreftymac

7

এখানে আরও একটি সমাধান দেওয়া হল

var arr = Array.apply( null, { length: 4 } );
arr;  // [undefined, undefined, undefined, undefined] (in Chrome)
arr.length; // 4

প্রথম যুক্তি apply()হ'ল এই অবজেক্ট বাঁধাই, যা আমরা এখানে যত্ন করি না, তাই আমরা এটি সেট করি null

Array.apply(..)Array(..)ফাংশন কল করে এবং { length: 3 }বস্তুর মানটিকে তার আর্গুমেন্ট হিসাবে ছড়িয়ে দিচ্ছে ।


আমি বুঝতে পারছি না যে এই উত্তরটি কেন ডাউনটা পেয়েছে। এটি আসলে একটি দুর্দান্ত হ্যাক। এর অর্থ আপনি এর new Array(n)মতো একটি অ্যারে শুরু করার জন্য ব্যবহার করতে পারবেন না new Array(n).map(function(notUsed,index){...}), তবে @ জাংউ যেমন উল্লেখ করেছেন, এই পদ্ধতির সাথে আপনি এটি করতে পারেন। আমার কাছ থেকে +1
ভিক্টর.পালিভোদা

3

অ্যারে কনস্ট্রাক্টরের একটি অস্পষ্ট সিনট্যাক্স রয়েছে এবং জেএসলিন্ট সর্বোপরি আপনার অনুভূতিতে আঘাত করে।

এছাড়াও, আপনার উদাহরণ কোডটি নষ্ট হয়ে গেছে, দ্বিতীয় varবিবৃতিটি একটি উত্থাপন করবে SyntaxError। আপনি lengthঅ্যারের সম্পত্তি সেট করে দিচ্ছেন test, সুতরাং অন্যের দরকার নেই var

আপনার বিকল্পগুলি যতদূর array.lengthযায় কেবলমাত্র "পরিষ্কার" " প্রশ্নটি হচ্ছে, আপনাকে প্রথমে আকারটি কেন সেট করতে হবে? সেই নির্ভরতা থেকে মুক্তি পেতে আপনার কোডটি রিফ্যাক্টর করার চেষ্টা করুন।


ওফস, দ্বিতীয় দিকে ভাল নজর var test। এটি ছিল আমার কিছু অংশে copyালু অনুলিপি এবং আটকানো।
মাইকেল মার্টিন-ধূমপায়ী

@ আইভোওয়েজেল, আপনি কর্মক্ষমতা উন্নত করতে আকার নির্ধারণ করতে চান। জেএস অ্যারেগুলি গতিশীল অ্যারে হয় । আপনি যদি আকারটি সেট না করেন (বা বরং এটির ক্ষমতা), জেএস ডিফল্ট আকারের একটি অ্যারে বরাদ্দ করবে। যদি আপনি তারপরে ফিটের চেয়ে আরও বেশি উপাদান যুক্ত করেন তবে এটি অ্যারে বৃদ্ধি করতে হবে, যার অর্থ এটি অভ্যন্তরীণভাবে একটি নতুন অ্যারে বরাদ্দ করবে এবং তারপরে সমস্ত উপাদানগুলি অনুলিপি করবে।
ডোমি

3

ধরে নিচ্ছি যে অ্যারের দৈর্ঘ্য ধ্রুবক। জাভাস্ক্রিপ্টে, আমরা এটিই করি:

const intialArray = new Array(specify the value);


2

উপরে বর্ণিত হিসাবে, ব্যবহার new Array(size)কিছুটা বিপজ্জনক। এটি সরাসরি ব্যবহার না করে এটিকে একটি "অ্যারে ক্রিয়েটর ফাংশন" এর ভিতরে রাখুন। আপনি সহজেই নিশ্চিত করতে পারেন যে এই ফাংশনটি বাগ-মুক্ত এবং আপনি new Array(size)সরাসরি কল করার ঝুঁকি এড়াতে পারেন । এছাড়াও, আপনি এটি একটি alচ্ছিক ডিফল্ট প্রাথমিক মান দিতে পারেন। এই createArrayফাংশনটি ঠিক তা করে:

function createArray(size, defaultVal) {
    var arr = new Array(size);
    if (arguments.length == 2) {
        // optional default value
        for (int i = 0; i < size; ++i) {
            arr[i] = defaultVal;
        }
    }
    return arr;
}

1

বেশিরভাগ উত্তরে এটি fillঅ্যারের সুপারিশ করা হয় কারণ অন্যথায় "আপনি এটির উপরে পুনরাবৃত্তি করতে পারবেন না" , তবে এটি সত্য নয়। আপনি খালি অ্যারের পুনরাবৃত্তি করতে পারেন, কেবল এটির সাথে নয় forEach। লুপগুলি যখন, লুপগুলির জন্য এবং আমি লুপগুলির জন্য ভাল কাজ করি।

const count = Array(5);

কাজ করে না.

console.log('---for each loop:---');
count.forEach((empty, index) => {
    console.log(`counting ${index}`);
});

এই কাজ:

console.log('---for of loop:---');
for (let [index, empty] of count.entries()) {
  console.log(`counting for of loop ${index}`);
}

console.log('---for i loop:---');
for (let i = 0, il = count.length; i < il; ++i) {
  console.log(`counting for i loop ${i}`);
}

console.log('---while loop:---');
let index = 0;
while (index < count.length) { 
  console.log(`counting while loop ${index}`); 
  index++; 
}

উপরের উদাহরণগুলির সাথে এই কোলাহলটি পরীক্ষা করুন ।

এছাড়াও অ্যাংগুলার *ngForএকটি খালি অ্যারে দিয়ে দুর্দান্ত কাজ করে:

<li *ngFor="let empty of count; let i = index" [ngClass]="
  <span>Counting with *ngFor {{i}}</span>
</li>

-1

আপনি ব্যবহার করে অ্যারে দৈর্ঘ্য সেট করতে পারেন array.length = youValue

তাই হবে

var myArray = [];
myArray.length = yourValue;

-3

আপনার ব্যবহার না করার কারণটি new Arrayএই কোড দ্বারা প্রদর্শিত হয়:

var Array = function () {};

var x = new Array(4);

alert(x.length);  // undefined...

অন্য কিছু কোড অ্যারে ভেরিয়েবলের সাথে গোলযোগ করতে পারে । আমি জানি যে কিছুটা দূরে এলো যে যে কেউ এই জাতীয় কোড লিখবে, তবে এখনও ...

এছাড়াও, যেমন ফেলিক্স কিং বলেছিলেন, ইন্টারফেসটি কিছুটা বেমানান, এবং এটি বেশ কিছু কঠিন-ট্র্যাক-ডাউন-বাগের দিকে নিয়ে যেতে পারে।

আপনি যদি দৈর্ঘ্য = এক্স সহ একটি অ্যারে চেয়েছিলেন, অপরিজ্ঞায়িত (যেমনটি new Array(x)হবে) ভরাট , আপনি এটি করতে পারেন:

var x = 4;
var myArray = [];
myArray[x - 1] = undefined;

alert(myArray.length); // 4

48
এই যুক্তি অনুসারে আপনার ব্যবহার করা উচিত নয় alertএবং undefined, কারণ অন্য কিছু কোড তাদের সাথে ঝামেলা করতে পারে। দ্বিতীয় উদাহরণটি তার চেয়ে কম পঠনযোগ্য new Array(4)এবং আপনাকে একই ফল দেয় না: jsfiddle.net/73fKd
আলেক্সি লেবেদেভ

25
এই উত্তরটি উদ্ভট
মার্কো ডেমাইও

6
আপনি জাভাস্ক্রিপ্টে গ্লোবাল অবজেক্টের সাথে লোকজনকে গোলযোগ এড়াতে পারবেন না; লোকেরা যেভাবে কাজ করে সেখানে কেবল এটি করা বা ফ্রেমওয়ার্ক ব্যবহার করবেন না।
রিচার্ড কানামাচার

ক্রোম রেপিলায় বর্তমানে: j = নতুন অ্যারে (4); j.length; // ফলাফল 4
পরীস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.