জাভাস্ক্রিপ্টে একটি স্বেচ্ছাসেবী দৈর্ঘ্যের শূন্য ভরা অ্যারে তৈরির সবচেয়ে কার্যকর উপায় কী?
let i = 0; Array.from(Array(10), ()=>i++);
জাভাস্ক্রিপ্টে একটি স্বেচ্ছাসেবী দৈর্ঘ্যের শূন্য ভরা অ্যারে তৈরির সবচেয়ে কার্যকর উপায় কী?
let i = 0; Array.from(Array(10), ()=>i++);
উত্তর:
ES6 পরিচয় করিয়ে দেয় Array.prototype.fill
। এটি এর মতো ব্যবহার করা যেতে পারে:
new Array(len).fill(0);
এটি দ্রুত কিনা তা নিশ্চিত নয় তবে আমি এটি পছন্দ করি কারণ এটি সংক্ষিপ্ত এবং স্ব-বর্ণনামূলক।
এটি এখনও আই-তে নেই ( সামঞ্জস্যতা পরীক্ষা করুন ), তবে একটি পলিফিল উপলব্ধ ।
new Array(len)
বেদনাদায়ক ধীর। (arr = []).length = len; arr.fill(0);
সবচেয়ে দ্রুত সমাধান
arr = Array(n)
এবং অনুমান (arr = []).length = n
অনুসারে অভিন্ন আচরণ করুন। কিছু বাস্তবায়নে একটি দ্রুততর হতে পারে, তবে আমি মনে করি না এর মধ্যে আরও বড় পার্থক্য রয়েছে।
(arr = []).length = 1000;
বিরুদ্ধে এই লাইনটি ব্যবহার করা arr = new Array(1000);
... এটি new
অত্যন্ত ধীর slow এখন, অ্যারের দৈর্ঘ্যের জন্য ছোট .. বলুন <50 বা সেখানে অস্তিত্ব আছে ... তবে new Array()
আরও ভাল পারফর্ম করা হবে বলে মনে হচ্ছে না। তবে ..
arr.fill(0)
... সমস্ত কিছু পরিবর্তিত হয়। এখন, new Array()
ব্যবহারগুলি বেশিরভাগ ক্ষেত্রেই দ্রুততর হয় কেবলমাত্র আপনি 100000 এর অ্যারে পেতে না পারলে ... তারপরে আপনি আবার গতি বৃদ্ধি আরও দেখতে শুরু করতে পারেন। তবে যদি আপনাকে আসলে এটি জিরো দিয়ে প্রিফিল করতে না হয় এবং খালি অ্যারেগুলির স্ট্যান্ডার্ড ফ্যালসি ব্যবহার করতে পারেন। তারপরে (arr = []).length = x
বেশিরভাগ সময় আমার পরীক্ষার ক্ষেত্রে দ্রুত পাগল হয়।
new Array(5).forEach(val => console.log('hi'));
বনাম চেষ্টা করুন new Array(5).fill(undefined).forEach(val => console.log('hi'));
।
যদিও এটি একটি পুরানো থ্রেড, আমি এটিতে আমার 2 সেন্ট যোগ করতে চেয়েছিলাম। এটি কতটা ধীর / গতিবেগ তা নিশ্চিত নয়, তবে এটি দ্রুত একটি লাইনার। আমি যা করি তা এখানে:
আমি যদি কোনও সংখ্যার সাথে প্রাক-পূরণ করতে চাই:
Array.apply(null, Array(5)).map(Number.prototype.valueOf,0);
// [0, 0, 0, 0, 0]
আমি যদি একটি স্ট্রিং দিয়ে প্রাক-পূরণ করতে চাই:
Array.apply(null, Array(3)).map(String.prototype.valueOf,"hi")
// ["hi", "hi", "hi"]
অন্যান্য উত্তরের পরামর্শ দেওয়া হয়েছে:
new Array(5+1).join('0').split('')
// ["0", "0", "0", "0", "0"]
তবে আপনি যদি 0 (সংখ্যা) চান এবং "0" (একটি স্ট্রিংয়ের ভিতরে শূন্য) চান না, আপনি এটি করতে পারেন:
new Array(5+1).join('0').split('').map(parseFloat)
// [0, 0, 0, 0, 0]
Array.apply(null, new Array(5)).map(...)
? খালি কাজ করার কারণ (নতুন অ্যারে (5)) মানচিত্র (...)
new
) আপনি যখন Array(5)
এমন কোনও বস্তু তৈরি করছেন যা টাইপাকে এমন দেখাচ্ছে: { length: 5, __proto__: Array.prototype }
- চেষ্টা করুন console.dir( Array(5) )
। লক্ষ করুন যে কোনো বৈশিষ্ট্য নেই 0
, 1
, 2
, ইত্যাদি কিন্তু আপনি যখন apply
যে কাছে Array
কন্সট্রাকটর, এটা বলার অপেক্ষা রাখে না মত Array(undefined, undefined, undefined, undefined, undefined)
। এবং আপনি এমন একটি বস্তু পেয়েছেন যা কিন্ডার মতো দেখাচ্ছে { length: 5, 0: undefined, 1: undefined...}
। map
বৈশিষ্ট্য 0
, 1
ইত্যাদির উপর কাজ করে which এজন্য আপনার উদাহরণটি কাজ করে না, তবে আপনি যখন apply
এটি ব্যবহার করেন তখন।
.apply
হ'ল আপনি যা চান তা হ'ল this
। এই উদ্দেশ্যগুলির জন্য this
কিছু যায় আসে না - আমরা কেবলমাত্র "বৈশিষ্ট্য" এর পরামিতি ছড়িয়ে দেওয়ার বিষয়ে যত্নশীল। .apply
যাতে এটি কোনও মূল্য হতে পারে। আমি পছন্দ করি null
কারণ এটি সস্তা, আপনি সম্ভবত ব্যবহার করতে চান না {}
বা []
যেহেতু আপনি কোনও কারণ ছাড়াই কোনও বস্তুকে তাত্ক্ষণিকভাবে চালাবেন।
ES6 ব্যবহার করে এটি করার আরও একটি উপায় এখানে এখনও পর্যন্ত কেউ উল্লেখ করেনি:
> Array.from(Array(3), () => 0)
< [0, 0, 0]
এটি দ্বিতীয় প্যারামিটার হিসাবে একটি মানচিত্র ফাংশন পাস করে কাজ করে Array.from
।
উপরের উদাহরণে, প্রথম প্যারামিটারটি ভ্যালুতে পূর্ণ 3 পজিশনের একটি অ্যারে বরাদ্দ করে undefined
এবং তারপরে ল্যাম্বদা ফাংশন তাদের প্রত্যেককে মানকে মানচিত্র করে 0
।
যদিও Array(len).fill(0)
সংক্ষিপ্ত, আপনাকে প্রথমে কিছু গণনা করে অ্যারে পূরণ করার প্রয়োজন হলে এটি কাজ করে না (আমি জানি প্রশ্নটি এটি জিজ্ঞাসা করে নি, তবে অনেক লোক এখানে এটি সন্ধান করছে) ।
উদাহরণস্বরূপ, আপনার যদি 10 টি এলোমেলো সংখ্যার সাথে অ্যারের প্রয়োজন হয়:
> Array.from(Array(10), () => Math.floor(10 * Math.random()))
< [3, 6, 8, 1, 9, 3, 0, 6, 7, 1]
এটি সমমানের চেয়ে আরও সংক্ষিপ্ত (এবং মার্জিত):
const numbers = Array(10);
for (let i = 0; i < numbers.length; i++) {
numbers[i] = Math.round(10 * Math.random());
}
এই পদ্ধতিটি কলব্যাকে প্রদত্ত সূচক প্যারামিটারের সুযোগ নিয়ে সংখ্যার ক্রম উত্পন্ন করতে ব্যবহার করা যেতে পারে:
> Array.from(Array(10), (d, i) => i)
< [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
repeat()
যেহেতু এই উত্তরটি ভালভাবে মনোযোগ পাচ্ছে, তাই আমি এই দুর্দান্ত কৌশলটিও দেখাতে চেয়েছিলাম। যদিও আমার মূল উত্তরের মতো কার্যকর না হলেও এটি এখনও খুব পরিচিত না, তবে স্ট্রিং repeat()
পদ্ধতিটি কার্যকরভাবে পরিচয় করিয়ে দেবে । কৌশলটি এখানে:
> "?".repeat(10).split("").map(() => Math.floor(10 * Math.random()))
< [5, 6, 3, 5, 0, 8, 2, 7, 4, 1]
শীতল হাহ? repeat()
একটি স্ট্রিং তৈরির জন্য খুব দরকারী পদ্ধতি যা নির্দিষ্ট স্ট্রিংয়ের নির্দিষ্ট সংখ্যার পুনরাবৃত্তি। এর পরে, split()
আমাদের জন্য একটি অ্যারে তৈরি করে, যা তারপরে map()
আমরা যে মানগুলি চাই তা অনুসরণ করে। পদক্ষেপে এটি ভঙ্গ:
> "?".repeat(10)
< "??????????"
> "?".repeat(10).split("")
< ["?", "?", "?", "?", "?", "?", "?", "?", "?", "?"]
> "?".repeat(10).split("").map(() => Math.floor(10 * Math.random()))
< [5, 6, 3, 5, 0, 8, 2, 7, 4, 1]
repeat
কৌশলটি অবশ্যই প্রযোজনায় চায়নি, Array.from()
পুরোপুরি ঠিক আছে :-)
Array(n).fill(0)
(১ char চর), যেখানে n
অ্যারের আকার
2018.10.28 আমি অন্যান্য উত্তর থেকে 15 টি প্রস্তাবের পারফরম্যান্স তুলনা করেছি। ম্যাক ওএস এক্স 10.13.6 উচ্চ সিয়েরাতে তিনটি ব্রাউজারে পরীক্ষা করা হয়েছিল: ক্রোম 69.0.3497, সাফারি 12.0 (13606.2.11) এবং ফায়ারফক্স 63৩.০ (bit৪ বিট)।
আমি নীচে দ্রুত ব্রাউজার (সাফারি) এর ফলাফল দেখাব:
সমস্ত ব্রাউজারের জন্য দ্রুততম সমাধান এম ছিল - তবে এটি "সাধারণ অ্যারে" নয় (তবে খুব দ্রুত) - সাফারি 33.8k অপারেশন / সেকেন্ড, ক্রোম 5.2 কে, এফএফ 3.5 কে,
সাধারণ অ্যারেগুলির দ্রুততম সমাধান:
সবচেয়ে ধীর সমাধান:
সমাধান এন কেবল ফায়ারফক্স এবং ক্রোমে কাজ করে।
দ্রুততম:
ধীরতম:
n
ফায়ারফক্সে ছোট বাদে ) এম let a = new Float32Array(n)
( (তবে সাধারণ অ্যারে নয়) - এর জন্য দ্রুততম ব্রাউজারটি ছিল সাফারি ( n
ক্রোমের চেয়ে বড় > 6x দ্রুত,> ফায়ারফক্সের চেয়ে 9x দ্রুত)let a = Array(n).fill(0)
(দ্রুত এবং সংক্ষিপ্ত কোড) আপনি এখানে আপনার মেশিনে পরীক্ষা করতে পারেন ।
let a=[]; for(i=n;i--;) a.push(0);
- তবে এটি 4x এর চেয়ে ধীর fill(0)
- তাই আমি এমনকি সেই ক্ষেত্রে ছবির ডাইনিকে আপডেট করব না।
ইতিমধ্যে উল্লিখিত ES 6 পূরণের পদ্ধতিটি সুন্দরভাবে এটি যত্ন করে। বেশিরভাগ আধুনিক ডেস্কটপ ব্রাউজারগুলি ইতিমধ্যে আজকের হিসাবে প্রয়োজনীয় অ্যারে প্রোটোটাইপ পদ্ধতিগুলিকে সমর্থন করে (ক্রোমিয়াম, এফএফ, এজ এবং সাফারি) [ 1 ]। আপনি MDN- এ বিশদটি সন্ধান করতে পারেন । একটি সাধারণ ব্যবহার উদাহরণ
a = new Array(10).fill(0);
বর্তমান ব্রাউজার সমর্থন প্রদত্ত আপনি আপনার শ্রোতা আধুনিক ডেস্কটপ ব্রাউজারগুলি ব্যবহার করেন না তা নিশ্চিত হওয়া পর্যন্ত আপনি এটি ব্যবহার করতে সতর্ক হওয়া উচিত।
a = Array(10).fill(null).map(() => { return []; });
a = Array(10).fill(0).map( _ => [] );
নোট যোগ করা অগস্ট 2013, ফেব্রুয়ারী 2015 আপডেট হয়েছে: 2009 থেকে নীচের উত্তর জাভাস্ক্রিপ্টের জেনেরিকের সাথে সম্পর্কিত Array
ধরণের । এটা তোলে নতুন কহা না টাইপ [MANY ব্রাউজারে এখন এবং উপলব্ধ] ES2015 সংজ্ঞায়িত অ্যারে, মত Int32Array
এবং এই ধরনের। এছাড়াও খেয়াল করুন যে ES2015 fill
উভয় অ্যারে এবং টাইপ করা অ্যারেগুলিতে একটি পদ্ধতি যুক্ত করেছে , এটি সম্ভবত পূরণের সবচেয়ে কার্যকর উপায় হতে পারে ...
এছাড়াও, আপনি কীভাবে অ্যারে তৈরি করেন তা কিছু বাস্তবায়নে এটি একটি বড় পার্থক্য করতে পারে। ক্রোমের ভি 8 ইঞ্জিন, বিশেষত, কেবলমাত্র যখন প্রয়োজন তখন অবজেক্ট-ভিত্তিক অ্যারেটিতে স্থানান্তরিত করতে পারে এমনটি যদি মনে করে তবে এটি একটি অত্যন্ত দক্ষ, সংক্ষিপ্ত-মেমরি অ্যারে ব্যবহার করার চেষ্টা করে।
বেশিরভাগ ভাষার সাথে এটি প্রাক-বরাদ্দ হবে, তারপরে শূন্য-পূরণ হবে:
function newFilledArray(len, val) {
var rv = new Array(len);
while (--len >= 0) {
rv[len] = val;
}
return rv;
}
তবে , জাভাস্ক্রিপ্ট অ্যারেগুলি সত্যই অ্যারে নয় , তারা অন্য সকল জাভাস্ক্রিপ্ট অবজেক্টের মতো কী / মানচিত্রের মানচিত্র, তাই করার জন্য কোনও "প্রাক-বরাদ্দ" নেই (দৈর্ঘ্য নির্ধারণ করে যে অনেকগুলি স্লট পূরণ করতে বরাদ্দ দেয় না), বা না বিশ্বাস করার কোনও কারণ আছে যে শূন্যে গণনা করার সুবিধা (যা কেবল লুপের তুলনায় দ্রুত তৈরি করা যায়) বিপরীত ক্রমে কীগুলি যুক্ত করে কার্যকর করা সম্ভব নয় যখন বাস্তবায়নটি কীগুলি পরিচালনা করার ক্ষেত্রে অনুকূলতা অর্জন করতে পারে তত্ত্বের অ্যারে সম্পর্কিত যা আপনি সাধারণত তাদের ক্রম হিসাবে করেন।
প্রকৃতপক্ষে, ম্যাথু ক্রামলে উল্লেখ করেছেন যে ফায়ারফক্সে গণনা গণনা করা তুলনায় উল্লেখযোগ্যভাবে ধীরে ধীরে, যার ফলস্বরূপ আমি নিশ্চিত করতে পারি - এটির অ্যারে অংশ (শূন্যের নিচে লুপিং একটি ভারে সীমাবদ্ধতা অবধি লুপিংয়ের চেয়ে আরও দ্রুত)। স্পষ্টতই বিপরীতে ক্রমে উপাদানগুলিকে অ্যারেতে যুক্ত করা ফায়ারফক্সের একটি ধীর গতি। প্রকৃতপক্ষে, জাভাস্ক্রিপ্ট প্রয়োগের ফলে ফলাফলগুলি কিছুটা পৃথক হয় (যা এতটা অবাক করে না)। ব্রাউজার বাস্তবায়নের জন্য এখানে নীচে একটি দ্রুত এবং নোংরা পরীক্ষার পৃষ্ঠা রয়েছে (খুব নোংরা, পরীক্ষার সময় ফল দেয় না, তাই ন্যূনতম প্রতিক্রিয়া সরবরাহ করে এবং স্ক্রিপ্ট সময়সীমা থেকে অনেক বেশি চলবে)। আমি পরীক্ষার মধ্যে রিফ্রেশ সুপারিশ; আপনি যদি না করেন তবে এফএফ (কমপক্ষে) পুনরাবৃত্তি পরীক্ষাগুলি ধীর করে দেয়।
অ্যারে # কনক্যাট ব্যবহার করা মোটামুটি জটিল সংস্করণটি এফএফ-তে সরাসরি 1000 থেকে 2,000 অ্যালিমেন্ট অ্যারেগুলির তুলনায় দ্রুততর হয়। ক্রোমের ভি 8 ইঞ্জিনে, যদিও স্ট্রেট ডিএন প্রতিবারই জয়ী হয় ...
পরীক্ষার পৃষ্ঠাটি এখানে ( সরাসরি কপি ):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Zero Init Test Page</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
#log p {
margin: 0;
padding: 0;
}
.error {
color: red;
}
.winner {
color: green;
font-weight: bold;
}
</style>
<script type='text/javascript' src='prototype-1.6.0.3.js'></script>
<script type='text/javascript'>
var testdefs = {
'downpre': {
total: 0,
desc: "Count down, pre-decrement",
func: makeWithCountDownPre
},
'downpost': {
total: 0,
desc: "Count down, post-decrement",
func: makeWithCountDownPost
},
'up': {
total: 0,
desc: "Count up (normal)",
func: makeWithCountUp
},
'downandup': {
total: 0,
desc: "Count down (for loop) and up (for filling)",
func: makeWithCountDownArrayUp
},
'concat': {
total: 0,
desc: "Concat",
func: makeWithConcat
}
};
document.observe('dom:loaded', function() {
var markup, defname;
markup = "";
for (defname in testdefs) {
markup +=
"<div><input type='checkbox' id='chk_" + defname + "' checked>" +
"<label for='chk_" + defname + "'>" + testdefs[defname].desc + "</label></div>";
}
$('checkboxes').update(markup);
$('btnTest').observe('click', btnTestClick);
});
function epoch() {
return (new Date()).getTime();
}
function btnTestClick() {
// Clear log
$('log').update('Testing...');
// Show running
$('btnTest').disabled = true;
// Run after a pause while the browser updates display
btnTestClickPart2.defer();
}
function btnTestClickPart2() {
try {
runTests();
}
catch (e) {
log("Exception: " + e);
}
// Re-enable the button; we don't yheidl
$('btnTest').disabled = false;
}
function runTests() {
var start, time, counter, length, defname, def, results, a, invalid, lowest, s;
// Get loops and length
s = $F('txtLoops');
runcount = parseInt(s);
if (isNaN(runcount) || runcount <= 0) {
log("Invalid loops value '" + s + "'");
return;
}
s = $F('txtLength');
length = parseInt(s);
if (isNaN(length) || length <= 0) {
log("Invalid length value '" + s + "'");
return;
}
// Clear log
$('log').update('');
// Do it
for (counter = 0; counter <= runcount; ++counter) {
for (defname in testdefs) {
def = testdefs[defname];
if ($('chk_' + defname).checked) {
start = epoch();
a = def.func(length);
time = epoch() - start;
if (counter == 0) {
// Don't count (warm up), but do check the algorithm works
invalid = validateResult(a, length);
if (invalid) {
log("<span class='error'>FAILURE</span> with def " + defname + ": " + invalid);
return;
}
}
else {
// Count this one
log("#" + counter + ": " + def.desc + ": " + time + "ms");
def.total += time;
}
}
}
}
for (defname in testdefs) {
def = testdefs[defname];
if ($('chk_' + defname).checked) {
def.avg = def.total / runcount;
if (typeof lowest != 'number' || lowest > def.avg) {
lowest = def.avg;
}
}
}
results =
"<p>Results:" +
"<br>Length: " + length +
"<br>Loops: " + runcount +
"</p>";
for (defname in testdefs) {
def = testdefs[defname];
if ($('chk_' + defname).checked) {
results += "<p" + (lowest == def.avg ? " class='winner'" : "") + ">" + def.desc + ", average time: " + def.avg + "ms</p>";
}
}
results += "<hr>";
$('log').insert({top: results});
}
function validateResult(a, length) {
var n;
if (a.length != length) {
return "Length is wrong";
}
for (n = length - 1; n >= 0; --n) {
if (a[n] != 0) {
return "Index " + n + " is not zero";
}
}
return undefined;
}
function makeWithCountDownPre(len) {
var a;
a = new Array(len);
while (--len >= 0) {
a[len] = 0;
}
return a;
}
function makeWithCountDownPost(len) {
var a;
a = new Array(len);
while (len-- > 0) {
a[len] = 0;
}
return a;
}
function makeWithCountUp(len) {
var a, i;
a = new Array(len);
for (i = 0; i < len; ++i) {
a[i] = 0;
}
return a;
}
function makeWithCountDownArrayUp(len) {
var a, i;
a = new Array(len);
i = 0;
while (--len >= 0) {
a[i++] = 0;
}
return a;
}
function makeWithConcat(len) {
var a, rem, currlen;
if (len == 0) {
return [];
}
a = [0];
currlen = 1;
while (currlen < len) {
rem = len - currlen;
if (rem < currlen) {
a = a.concat(a.slice(0, rem));
}
else {
a = a.concat(a);
}
currlen = a.length;
}
return a;
}
function log(msg) {
$('log').appendChild(new Element('p').update(msg));
}
</script>
</head>
<body><div>
<label for='txtLength'>Length:</label><input type='text' id='txtLength' value='10000'>
<br><label for='txtLoops'>Loops:</label><input type='text' id='txtLoops' value='10'>
<div id='checkboxes'></div>
<br><input type='button' id='btnTest' value='Test'>
<hr>
<div id='log'></div>
</div></body>
</html>
ডিফল্টরূপে Uint8Array
, Uint16Array
এবং Uint32Array
ক্লাস, তার মান হিসাবে শূন্য রাখা যাতে করে আপনাকে কোনো জটিল ভর্তি কৌশল প্রয়োজন হবে না, শুধু একটি করুন:
var ary = new Uint8Array(10);
অ্যারের সমস্ত উপাদান ary
ডিফল্টভাবে শূন্য হবে।
Array.isArray(ary)
হয় false
। দৈর্ঘ্যটি কেবল পঠনযোগ্য তাই আপনি নতুন আইটেমগুলিকে এর মতো ary.push
0
তাদের ডিফল্ট মান হিসাবে রাখে wi
Array.from(new Uint8Array(10))
একটি সাধারণ অ্যারে সরবরাহ করবে।
Array(n).fill(0)
আপনার যদি জেএস অ্যারে আসলেই প্রয়োজন হয় তবে এটি ক্রোমের চেয়ে প্রায় 5x কম er আপনি যদি কোনও টাইপড্রাই ব্যবহার করতে পারেন তবে এটির তুলনায় এটি আরও দ্রুততর .fill(0)
, বিশেষত যদি আপনি এর ডিফল্ট আরম্ভকারী মানটি ব্যবহার করতে পারেন 0
। এমন কোনও নির্মাণকারীর মতো মনে হচ্ছে না যা পূরণের মান এবং দৈর্ঘ্য নেয়, সি ++ std::vector
এর মতো উপায় । এটি শূন্য নয় এমন কোনও মানের জন্য মনে হচ্ছে আপনাকে একটি শূন্যযুক্ত টাইপড্ররে তৈরি করতে হবে এবং তারপরে এটি পূরণ করতে হবে। : /
আপনি যদি ES6 ব্যবহার করেন তবে আপনি অ্যারে.ফর্ম () এর মতো ব্যবহার করতে পারেন :
Array.from({ length: 3 }, () => 0);
//[0, 0, 0]
একই ফলাফল আছে
Array.from({ length: 3 }).map(() => 0)
//[0, 0, 0]
কারণ
Array.from({ length: 3 })
//[undefined, undefined, undefined]
function makeArrayOf(value, length) {
var arr = [], i = length;
while (i--) {
arr[i] = value;
}
return arr;
}
makeArrayOf(0, 5); // [0, 0, 0, 0, 0]
makeArrayOf('x', 3); // ['x', 'x', 'x']
লক্ষ্য করুন while
সাধারণত অধিক কার্যকরী হয় for-in
, forEach
ইত্যাদি
i
স্থানীয় পরিবর্তনশীল বিদেশী? length
মান দ্বারা পাস করা হয় যাতে আপনার এটি সরাসরি হ্রাস করতে সক্ষম হওয়া উচিত।
arr[i] = value
) একটি স্বেচ্ছাসেবী বিন্দুতে মান নির্ধারণ করা খুব ধীর । এটি শুরু থেকে শেষ এবং ব্যবহার পর্যন্ত লুপ করা খুব দ্রুত arr.push(value)
। এটি বিরক্তিকর, কারণ আমি আপনার পদ্ধতিটি পছন্দ করি।
অবজেক্ট স্বরলিপি ব্যবহার করে
var x = [];
শূন্য ভরা? মত ...
var x = [0,0,0,0,0,0];
'অপরিবর্তিত' দিয়ে ভরা ...
var x = new Array(7);
শূন্য সঙ্গে আপত্তি স্বরলিপি
var x = [];
for (var i = 0; i < 10; i++) x[i] = 0;
পার্শ্ব নোট হিসাবে, আপনি যদি অ্যারের প্রোটোটাইপটি উভয়টি সংশোধন করেন
var x = new Array();
এবং
var y = [];
এই প্রোটোটাইপ পরিবর্তন আছে
যাইহোক, আমি এই অপারেশনের দক্ষতা বা গতির সাথে অত্যধিকভাবে উদ্বিগ্ন হব না, এমন আরও অনেকগুলি কাজ রয়েছে যা আপনি সম্ভবত করছেন যেগুলি শূন্যগুলি সহ নির্ধারিত দৈর্ঘ্যের অ্যারে ইনস্ট্যান্সিয়েট করার চেয়ে অনেক বেশি অপচয় এবং ব্যয়বহুল।
null
এই অ্যারেটিতে কোনও এস নেই -var x = new Array(7);
new Array(7)
"অপরিবর্তিত" দিয়ে কোনও অ্যারে তৈরি করে না । এটি দৈর্ঘ্যের 7 সহ একটি খালি অ্যারে তৈরি করে
(new Array(10)).fill(0)
।
আমি প্রাক বরাদ্দকৃত / প্রাক-বরাদ্দ নয়, গণনা / নিচে গণনা এবং আই 6/7/8, ফায়ারফক্স 3.5, ক্রোম এবং অপেরাতে লুপগুলি / এর জন্য সমস্ত সংমিশ্রণ পরীক্ষা করেছি।
নীচের ফাংশনগুলি ফায়ারফক্স, ক্রোম এবং আই 8 এ ধারাবাহিকভাবে দ্রুত বা অত্যন্ত নিকটে ছিল এবং অপেরা এবং আইই 6 এর দ্রুততম তুলনায় খুব ধীর ছিল না এটি আমার মতে সহজতম এবং স্পষ্টও। আমি বেশ কয়েকটি ব্রাউজার পেয়েছি যেখানে লুপ সংস্করণটি সামান্য দ্রুত, তাই আমি এটিও রেফারেন্সের জন্য অন্তর্ভুক্ত করছি।
function newFilledArray(length, val) {
var array = [];
for (var i = 0; i < length; i++) {
array[i] = val;
}
return array;
}
অথবা
function newFilledArray(length, val) {
var array = [];
var i = 0;
while (i < length) {
array[i++] = val;
}
return array;
}
var array = []
ঘোষণাকে লুপের প্রথম অংশে ফেলে দিতে পারেন , কেবলমাত্র কমা দ্বারা পৃথক।
length
ইতিমধ্যে প্রদত্ত মানটিতে সেট করুন যাতে এটি নিয়মিত পরিবর্তন হয় না। আমার মেশিনে 1 মিলিয়ন দৈর্ঘ্যের অ্যারে শূন্যের 40 মিমি থেকে 8 টি পর্যন্ত এনেছে।
for (i = 0, array = []; i < length; ++i) array[i] = val;
.. কিছুটা ব্লক? ... যাইহোক, এছাড়াও ... আমি যদি array.length
নতুন অ্যারের দৈর্ঘ্যটি সেট করে রাখি .. তবে আমি এফএফ-তে আরও 10% -15% গতি বৃদ্ধি পাব বলে মনে হচ্ছে ... ক্রোমে, এটি গতি দ্বিগুণ বলে মনে হচ্ছে -> var i, array = []; array.length = length; while(i < length) array[i++] = val;
(আমি যদি এটি for
লুপ হিসাবে রেখে দিয়েছিলাম তবে আরও দ্রুত ছিল ... তবে আর while
আপনার কোডটি কার্যকর করার সময় যদি আপনাকে বিভিন্ন দৈর্ঘ্যের অনেকগুলি শূন্য ভরাট অ্যারে তৈরি করতে হয় তবে আমি এটির দ্রুততম উপায়টি খুঁজে পেয়েছি একবার শূন্য অ্যারে তৈরি করা is এই শর্তে উল্লিখিত পদ্ধতিগুলির একটি ব্যবহার করে আপনি জানেন যা কখনও ছাড়িয়ে যাবে না এবং তারপরে প্রয়োজনীয় অ্যারেটি কেটে নিন।
উদাহরণস্বরূপ (অ্যারে শুরু করার জন্য উপরের উত্তর থেকে ফাংশনটি ব্যবহার করে), দৈর্ঘ্য সর্বাধিক দৈর্ঘ্যের একটি শূন্য ভরাট অ্যারে তৈরি করুন , কোডটির জন্য শূন্য অ্যারেগুলির দরকার একটি ভেরিয়েবল হিসাবে:
var zero = newFilledArray(maxLength, 0);
এখন এই অ্যারের সব যেভাবেই আপনি দৈর্ঘ্যের একটি শূন্য ভরা অ্যারের প্রয়োজন requiredLength < MAXLENGTH :
zero.slice(0, requiredLength);
আমি আমার কোডটি কার্যকর করার সময় কয়েক হাজার বার শূন্য ভরাট অ্যারে তৈরি করছিলাম, এটি প্রক্রিয়াটিকে দুর্দান্তভাবে গতিবেগ করেছে।
এর বিরুদ্ধে আমার কিছুই নেই:
Array.apply(null, Array(5)).map(Number.prototype.valueOf,0);
new Array(5+1).join('0').split('').map(parseFloat);
জের্তোষ দ্বারা প্রস্তাবিত, তবে একটি নতুন ES6 অ্যারে এক্সটেনশনে আপনাকে fill
পদ্ধতিতে স্থানীয়ভাবে এটি করার অনুমতি দেয় । এখন আইই প্রান্ত, ক্রোম এবং এফএফ এটি সমর্থন করে তবে উপযুক্ততা সারণীটি পরীক্ষা করুন check
new Array(3).fill(0)
দিতে হবে [0, 0, 0]
। আপনি অ্যারে যেমন কোনও মান new Array(5).fill('abc')
(এমনকি বস্তু এবং অন্যান্য অ্যারে) দিয়ে পূরণ করতে পারেন ।
তার উপরে আপনি পূর্বের অ্যারেগুলি পূরণ করে সংশোধন করতে পারেন:
arr = [1, 2, 3, 4, 5, 6]
arr.fill(9, 3, 5) # what to fill, start, end
যা আপনাকে দেয়: [1, 2, 3, 9, 9, 6]
আমি সাধারণত যেভাবে এটি করি (এবং আশ্চর্যজনক দ্রুত) তা ব্যবহার করছে Uint8Array
। উদাহরণস্বরূপ, 1 এম উপাদানগুলির একটি শূন্য ভেক্টর তৈরি করা:
var zeroFilled = [].slice.apply(new Uint8Array(1000000))
আমি লিনাক্স ব্যবহারকারী এবং সর্বদা আমার জন্য কাজ করেছি, তবে একবার ম্যাক ব্যবহার করা বন্ধুর কিছু শূন্য উপাদান ছিল না। আমি ভেবেছিলাম তার মেশিনটি ত্রুটিযুক্ত ছিল, তবে এখনও এটি ঠিক করার জন্য আমরা এখানে সবচেয়ে নিরাপদ উপায় পেয়েছি:
var zeroFilled = [].slice.apply(new Uint8Array(new Array(1000000))
সম্পাদিত
ক্রোম 25.0.1364.160
ফায়ারফক্স 20.0
সবচেয়ে গুরুত্বপূর্ণ পরীক্ষাটি নিখোঁজ হয়েছে (কমপক্ষে আমার জন্য): নোড.জেএস একটি। আমি সন্দেহ করি এটি ক্রোম বেনমার্কের খুব কাছে।
লড্যাশ বা আন্ডারস্কোর ব্যবহার করা
_.range(0, length - 1, 0);
অথবা যদি আপনার কাছে অ্যারে বিদ্যমান থাকে এবং আপনি একই দৈর্ঘ্যের একটি অ্যারে চান
array.map(_.constant(0));
_.range(0, length, 0)
, আমি বিশ্বাস করি। লোডাশ শেষ মানটির সাথে একচেটিয়া
ECMAScript2016 হিসাবে, বড় অ্যারেগুলির জন্য একটি পরিষ্কার পছন্দ রয়েছে।
যেহেতু এই উত্তরটি এখনও গুগল অনুসন্ধানে শীর্ষের কাছাকাছি দেখা যাচ্ছে, তাই 2017 এর উত্তর এখানে।
কয়েক ডজন জনপ্রিয় পদ্ধতি সহ একটি বর্তমান জেএসবেঞ্চ এখানে রয়েছে, এই প্রশ্নটিতে এখন পর্যন্ত অনেকগুলি প্রস্তাবিত রয়েছে। আপনি যদি আরও ভাল পদ্ধতি খুঁজে পান তবে দয়া করে যুক্ত করুন, কাঁটাচামচ করুন এবং ভাগ করুন।
আমি লক্ষ করতে চাই যে একটি নির্বিচার দৈর্ঘ্য শূন্য ভরাট অ্যারে তৈরি করার জন্য সত্যিকারের সবচেয়ে কার্যকর উপায় নেই। আপনি গতির জন্য, বা স্বচ্ছতা এবং রক্ষণাবেক্ষণের জন্য অনুকূল করতে পারেন - হয় প্রকল্পের প্রয়োজনের উপর নির্ভর করে আরও দক্ষ পছন্দ হিসাবে বিবেচনা করা যেতে পারে।
গতির জন্য অনুকূলকরণ করার সময়, আপনি চান: আক্ষরিক বাক্য গঠন ব্যবহার করে অ্যারে তৈরি করুন; দৈর্ঘ্য সেট করুন, পুনরুক্তি পরিবর্তনশীল আরম্ভ করুন এবং কিছুক্ষণ লুপ ব্যবহার করে অ্যারের মাধ্যমে পুনরাবৃত্তি করুন। এখানে একটি উদাহরণ।
const arr = [];
arr.length = 120000;
let i = 0;
while (i < 120000) {
arr[i] = 0;
i++;
}
আর একটি সম্ভাব্য বাস্তবায়ন হ'ল:
(arr = []).length = n;
let i = 0;
while (i < n) {
arr[i] = 0;
i++;
}
তবে আমি এই দ্বিতীয় প্রতিস্থাপনটি ব্যবহারে দৃ strongly়ভাবে নিরুৎসাহিত করব কারণ এটি কম পরিষ্কার এবং আপনাকে আপনার অ্যারে ভেরিয়েবলের উপর ব্লক স্কোপিং বজায় রাখতে দেয় না।
এগুলি লুপের জন্য পূরণের চেয়ে উল্লেখযোগ্যভাবে দ্রুত এবং মানক পদ্ধতির চেয়ে প্রায় 90% দ্রুত faster
const arr = Array(n).fill(0);
তবে স্বচ্ছতা, সংক্ষিপ্ততা এবং রক্ষণাবেক্ষণের কারণে এই পূরণ পদ্ধতিটি এখনও ছোট অ্যারেগুলির পক্ষে সবচেয়ে কার্যকর পছন্দ। পারফরম্যান্স পার্থক্য সম্ভবত আপনাকে মেরে ফেলবে না আপনি যদি না কয়েক হাজার বা আরও বেশি ক্রমের উপর দিয়ে দৈর্ঘ্যের সাথে প্রচুর অ্যারে তৈরি করেন making
আরও কয়েকটি গুরুত্বপূর্ণ নোট বেশিরভাগ স্টাইল গাইড আপনাকে var
ES6 বা তার পরে ব্যবহার করার সময় খুব বিশেষ কারণ ছাড়াই আপনাকে আর ব্যবহার না করার পরামর্শ দেয় । const
পরিবর্তনশীলগুলির জন্য ব্যবহার করুন যা পুনরায় সংজ্ঞায়িত হবে না এবং let
ভেরিয়েবলগুলির জন্য যা হবে will MDN এবং Airbnb এর শৈলী গাইড মহান সর্বোত্তম কার্যাভ্যাস সম্পর্কে আরও তথ্যের জন্য যেতে স্থান। প্রশ্নগুলি সিনট্যাক্স সম্পর্কে ছিল না, তবে জেএসে নতুন লোকেরা পুরানো এবং নতুন উত্তরগুলির এই রিমগুলি অনুসন্ধান করার সময় এই নতুন মান সম্পর্কে জেনে রাখা গুরুত্বপূর্ণ।
একটি নতুন নতুন অ্যারে তৈরি করতে
new Array(arrayLength).fill(0);
বিদ্যমান অ্যারের শেষে কিছু মান যুক্ত করতে
[...existingArray, ...new Array(numberOfElementsToAdd).fill(0)]
//**To create an all new Array**
console.log(new Array(5).fill(0));
//**To add some values at the end of an existing Array**
let existingArray = [1,2,3]
console.log([...existingArray, ...new Array(5).fill(0)]);
উত্তরে এই পদ্ধতিটি দেখেনি, সুতরাং এটি এখানে:
"0".repeat( 200 ).split("").map( parseFloat )
ফলস্বরূপ আপনি দৈর্ঘ্যের 200 শূন্য-মূল্যবান অ্যারে পাবেন:
[ 0, 0, 0, 0, ... 0 ]
আমি এই কোডটির কার্যকারিতা সম্পর্কে নিশ্চিত নই তবে আপনি যদি এটি অপেক্ষাকৃত ছোট অ্যারে ব্যবহার করেন তবে এটি কোনও সমস্যা হওয়া উচিত নয়।
const arr = Array.from({ length: 10 }).fill(0)
লুপ কোডের জন্য সবচেয়ে ছোট
a=i=[];for(;i<100;)a[i++]=0;
edit:
for(a=i=[];i<100;)a[i++]=0;
or
for(a=[],i=100;i--;)a[i]=0;
নিরাপদ ভার্সন সংস্করণ
var a=[],i=0;for(;i<100;)a[i++]=0;
edit:
for(var i=100,a=[];i--;)a[i]=0;
n
খাটো হবে:for(var a=[];n--;a[n]=0);
আমার দ্রুততম কাজটি হবে:
function newFilledArray(len, val) {
var a = [];
while(len--){
a.push(val);
}
return a;
}
var st = (new Date()).getTime();
newFilledArray(1000000, 0)
console.log((new Date()).getTime() - st); // returned 63, 65, 62 milliseconds
অ্যারেতে আইটেম যুক্ত করতে নেটিভ পুশ এবং শিফ্ট ব্যবহার করা অ্যারের স্কোপটি ঘোষণা করার এবং প্রতিটি আইটেমটির মান নির্ধারণের চেয়ে উল্লেখ করার চেয়ে অনেক দ্রুত (প্রায় 10 বার)।
ফাইআই: ফায়ারব্যাগে (ফায়ারফক্স এক্সটেনশন) চালানোর সময় আমি প্রথম লুপটির সাথে ধারাবাহিকভাবে দ্রুতগতি লাভ করি।
var a = [];
var len = 1000000;
var st = (new Date()).getTime();
while(len){
a.push(0);
len -= 1;
}
console.log((new Date()).getTime() - st); // returned 863, 894, 875 milliseconds
st = (new Date()).getTime();
len = 1000000;
a = [];
for(var i = 0; i < len; i++){
a.push(0);
}
console.log((new Date()).getTime() - st); // returned 1155, 1179, 1163 milliseconds
আমি জানতে আগ্রহী যে টিজে ক্রোডার এটি কী করে? :-)
while (len--)
.. আমার প্রসেসিংয়ের সময়টি প্রায় 60 মিমি থেকে প্রায় 54 মিমি নিয়ে গেছে
এই concat
সংস্করণটি Chrome এ আমার পরীক্ষাগুলিতে আরও দ্রুত (2013-03-21)। 10,000,000 উপাদানের জন্য প্রায় 200ms সোজা আরম্ভের জন্য 675 বনাম।
function filledArray(len, value) {
if (len <= 0) return [];
var result = [value];
while (result.length < len/2) {
result = result.concat(result);
}
return result.concat(result.slice(0, len-result.length));
}
বোনাস: আপনি যদি স্ট্রিং দিয়ে আপনার অ্যারে পূরণ করতে চান তবে এটি করার একটি সংক্ষিপ্ত উপায় এটি (যতটা দ্রুত তত দ্রুত নয় concat
):
function filledArrayString(len, value) {
return new Array(len+1).join(value).split('');
}
আমি টিজে ক্রোডার দ্বারা দুর্দান্ত উত্তরটি পরীক্ষা করছিলাম, এবং ক্রোমে তার পরীক্ষাগুলিতে যে কোনওটি ছাড়িয়ে যায় এমন কনট্যাট সমাধানের ভিত্তিতে একটি পুনরাবৃত্ত মার্জ নিয়ে এসেছি (আমি অন্যান্য ব্রাউজারগুলিকে পরীক্ষা করি নি)।
function makeRec(len, acc) {
if (acc == null) acc = [];
if (len <= 1) return acc;
var b = makeRec(len >> 1, [0]);
b = b.concat(b);
if (len & 1) b = b.concat([0]);
return b;
},
পদ্ধতিটি কল করুন makeRec(29)
।
এটি উল্লেখ করার মতো হতে পারে Array.prototype.fill
, এটি ইসমাস্ক্রিপ্ট ((হারমোনি) প্রস্তাবনার অংশ হিসাবে যুক্ত করা হয়েছিল । থ্রেডে উল্লিখিত অন্যান্য বিকল্পগুলি বিবেচনা করার আগে আমি নীচে লিখিত পলিফিলটি দিয়ে যেতে চাই।
if (!Array.prototype.fill) {
Array.prototype.fill = function(value) {
// Steps 1-2.
if (this == null) {
throw new TypeError('this is null or not defined');
}
var O = Object(this);
// Steps 3-5.
var len = O.length >>> 0;
// Steps 6-7.
var start = arguments[1];
var relativeStart = start >> 0;
// Step 8.
var k = relativeStart < 0 ?
Math.max(len + relativeStart, 0) :
Math.min(relativeStart, len);
// Steps 9-10.
var end = arguments[2];
var relativeEnd = end === undefined ?
len : end >> 0;
// Step 11.
var final = relativeEnd < 0 ?
Math.max(len + relativeEnd, 0) :
Math.min(relativeEnd, len);
// Step 12.
while (k < final) {
O[k] = value;
k++;
}
// Step 13.
return O;
};
}
let filled = [];
filled.length = 10;
filled.fill(0);
console.log(filled);
আমি জানতাম আমার কোথাও এই প্রোটো আছে :)
Array.prototype.init = function(x,n)
{
if(typeof(n)=='undefined') { n = this.length; }
while (n--) { this[n] = x; }
return this;
}
var a = (new Array(5)).init(0);
var b = [].init(0,4);
সম্পাদনা: পরীক্ষা
জোশুয়া এবং অন্যান্য পদ্ধতির প্রতিক্রিয়া হিসাবে আমি আমার নিজস্ব বেঞ্চমার্কিং চালিয়েছি, এবং আমি তাদের প্রতিদ্বন্দ্বীদের সম্পূর্ণ ভিন্ন ফলাফল দেখছি।
আমি যা পরীক্ষা করেছি তা এখানে:
//my original method
Array.prototype.init = function(x,n)
{
if(typeof(n)=='undefined') { n = this.length; }
while (n--) { this[n] = x; }
return this;
}
//now using push which I had previously thought to be slower than direct assignment
Array.prototype.init2 = function(x,n)
{
if(typeof(n)=='undefined') { n = this.length; }
while (n--) { this.push(x); }
return this;
}
//joshua's method
function newFilledArray(len, val) {
var a = [];
while(len--){
a.push(val);
}
return a;
}
//test m1 and m2 with short arrays many times 10K * 10
var a = new Date();
for(var i=0; i<10000; i++)
{
var t1 = [].init(0,10);
}
var A = new Date();
var b = new Date();
for(var i=0; i<10000; i++)
{
var t2 = [].init2(0,10);
}
var B = new Date();
//test m1 and m2 with long array created once 100K
var c = new Date();
var t3 = [].init(0,100000);
var C = new Date();
var d = new Date();
var t4 = [].init2(0,100000);
var D = new Date();
//test m3 with short array many times 10K * 10
var e = new Date();
for(var i=0; i<10000; i++)
{
var t5 = newFilledArray(10,0);
}
var E = new Date();
//test m3 with long array created once 100K
var f = new Date();
var t6 = newFilledArray(100000, 0)
var F = new Date();
ফলাফল:
IE7 deltas:
dA=156
dB=359
dC=125
dD=375
dE=468
dF=412
FF3.5 deltas:
dA=6
dB=13
dC=63
dD=8
dE=12
dF=8
সুতরাং আমার গণনা ধাক্কা দিয়ে আসলেই সাধারণত ধীর হয় তবে এফএফ-তে দীর্ঘতর অ্যারেগুলির সাথে আরও ভাল সঞ্চালিত হয় তবে আইইয়ের চেয়েও খারাপ যা কেবল সাধারণভাবে (কোয়েল সারপ্রাইজ) ডাকে।
b = []...
) প্রথমটির চেয়ে 10-15% দ্রুত, তবে এটি জোশুয়ার উত্তরের চেয়ে 10 গুণ বেশি ধীর।
else {this.length=n;}
পরে একটি অন্তর্ভুক্ত করুন this.length
। এটি init
আলাদা দৈর্ঘ্যে পুনর্বিবেচনা করার সময় প্রয়োজনে এটি ইতিমধ্যে বিদ্যমান অ্যারে সংক্ষিপ্ত করবে n
।
নামবিহীন ফাংশন:
(function(n) { while(n-- && this.push(0)); return this; }).call([], 5);
// => [0, 0, 0, 0, 0]
লুপের সাথে কিছুটা খাটো:
(function(n) { for(;n--;this.push(0)); return this; }).call([], 5);
// => [0, 0, 0, 0, 0]
যে কোনও সাথেই কাজ করে Object
, কেবল যা ভিতরে রয়েছে তা পরিবর্তন করুন this.push()
।
আপনি এমনকি ফাংশনটি সংরক্ষণ করতে পারেন:
function fill(size, content) {
for(;size--;this.push(content));
return this;
}
এটি ব্যবহার করে কল করুন:
var helloArray = fill.call([], 5, 'hello');
// => ['hello', 'hello', 'hello', 'hello', 'hello']
ইতিমধ্যে বিদ্যমান অ্যারেতে উপাদান যুক্ত করা:
var helloWorldArray = fill.call(helloArray, 5, 'world');
// => ['hello', 'hello', 'hello', 'hello', 'hello', 'world', 'world', 'world', 'world', 'world']
পারফরম্যান্স: http://jsperf.com/zero-filled-array-creation/25