একটি অ্যারেতে একটি মানটি প্রিপেন্ড করার সর্বাধিক দক্ষ উপায়


268

ধরে নিচ্ছি যে আমার একটি অ্যারে রয়েছে যার আকার রয়েছে N(যেখানে N > 0), সেখানে অ্যারে প্রিপেন্ডিংয়ের আরও কার্যকর উপায় আছে যার জন্য ও (এন + 1) পদক্ষেপের প্রয়োজন হবে না?

কোডে, মূলত, আমি বর্তমানে যা করছি তা হ'ল

function prependArray(value, oldArray) {
  var newArray = new Array(value);

  for(var i = 0; i < oldArray.length; ++i) {
    newArray.push(oldArray[i]);
  }

  return newArray;
}

লিঙ্কযুক্ত তালিকাগুলি এবং পয়েন্টারগুলিকে আমি যতটা পছন্দ করি ততই আমার মনে হয় যে দেশীয় জেএস ডেটা টাইপ ব্যবহার করে জিনিসগুলি করার আরও কার্যকর উপায় থাকতে হবে
সাম্যাকোন

@ সাম্যাকোন: হ্যাঁ আমার মন্তব্যটিকে উপেক্ষা করুন দুঃখিত, আমি ভেবেছিলাম আপনি জাভা বলেছেন: পি
জিডাব্লুডাব্লু

3
জাভা, জাভাস্ক্রিপ্ট, সি বা পাইথন, কোন ভাষা তা বিবেচ্য নয়: অ্যারে বনাম লিঙ্কযুক্ত তালিকার মধ্যে জটিলতার ট্রেডঅফ একই। লিঙ্কযুক্ত তালিকাগুলি সম্ভবত জেএসে বেশ অনর্থক কারণ তাদের জন্য কোনও অন্তর্নির্মিত শ্রেণি নেই (জাভা থেকে আলাদা), তবে আপনি যা চান তা যদি ও (1) সন্নিবেশের সময় হয় তবে আপনি একটি লিঙ্কযুক্ত তালিকা চান want
mgiuca

1
এটি ক্লোন করা প্রয়োজন?
রায়ান ফ্লোরেন্স

1
যদি এটির ক্লোন করার প্রয়োজন হয় তবে আনশিফ্টটি অনুপযুক্ত since
এমজিচা

উত্তর:


492

আমি বিগ-ও-র ক্ষেত্রে আরও দক্ষ সম্পর্কে নিশ্চিত নই তবে অবশ্যই unshiftপদ্ধতিটি আরও সংক্ষিপ্ত:

var a = [1, 2, 3, 4];
a.unshift(0);
a; // => [0, 1, 2, 3, 4]

[সম্পাদনা]

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

a.slice().unshift(0); // Use "slice" to avoid mutating "a".

[সম্পাদনা 2]

সম্পূর্ণতার জন্য, prependArray(...)অ্যারে unshift(...)পদ্ধতির সুবিধা গ্রহণের জন্য নীচের ফাংশনটি ওপির উদাহরণের পরিবর্তে ব্যবহার করা যেতে পারে :

function prepend(value, array) {
  var newArray = array.slice();
  newArray.unshift(value);
  return newArray;
}

var x = [1, 2, 3];
var y = prepend(0, x);
y; // => [0, 1, 2, 3];
x; // => [1, 2, 3];

190
কে prepend" unshift" কল করার সিদ্ধান্ত নিয়েছে ?
স্কট স্টাফোর্ড

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

12
আনশিফ্ট শিফট করার পরিপূরক ফাংশন। এটিকে "প্রিপেন্ড" বলা অদ্ভুত পছন্দ হবে। পপ করার জন্য ধাক্কা হ'লে আনশিফ্টটি স্থানান্তরিত হয়।
স্যার রবার্ট

9
এই সমাধান সহ কেবল একটি ইস্যু। (উত্তোলন) () এর দৈর্ঘ্যটি আর উত্তরের মতো অ্যারেটি ফেরত দেয় না ? w3schools.com/jsref/jsref_unshift.asp
আইডিভিবি

4
pushএবং unshiftউভয় ধারণ করে u, যেখানে আছে popএবং shiftনেই।
কিয়ান চেন

70

ES6 এর সাহায্যে, আপনি এখন আসল উপাদানগুলির আগে newোকানো আপনার নতুন উপাদানগুলির সাথে একটি নতুন অ্যারে তৈরি করতে স্প্রেড অপারেটরটি ব্যবহার করতে পারেন ।

// Prepend a single item.
const a = [1, 2, 3];
console.log([0, ...a]);

// Prepend an array.
const a = [2, 3];
const b = [0, 1];
console.log([...b, ...a]);

আপডেট 2018-08-17: পারফরম্যান্স

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


4
এটি ২০১ 2017 সালের মতো ভোট দেওয়া উচিত It's এটি সংক্ষিপ্ত। স্প্রেড ব্যবহার করে এটি নতুন স্ট্রিমটি ফিরিয়ে দেয়, যা আরও সংশোধন করে চেইনে কার্যকর হতে পারে। এটি খাঁটি (অর্থাত্ ক এবং খ প্রভাবিত নয়)
সাইমন

আপনি তুলনামূলকভাবে যে সময়টি নিয়েছিলেন তা সম্পর্কে আপনি উল্লেখ করেননিunshift
শশাঙ্ক বিবেক

ধন্যবাদ @ শশাঙ্কভিবেক। আমি এই উত্তরটি একটি বিকল্প সিনট্যাক্স উপস্থাপনের উদ্দেশ্যে করেছি যা আমার মনে হয় যে এটি আরও স্মরণীয় এবং সংক্ষিপ্ত। আমি আপডেট করব।
ফ্রাঙ্ক ট্যান

@ ফ্র্যাঙ্কটান: চিয়ার্স :) +1
শশাঙ্ক বিবেক

46

আপনি যদি অন্য অ্যারের সামনের দিকে কোনও অ্যারে প্রিন্ডেন্ট করে থাকেন তবে কেবল এটি ব্যবহার করা আরও দক্ষ concat। তাই:

var newArray = values.concat(oldArray);

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

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


2
ওহ হ্যাঁ, আমি ভুলে গেছি unshift। তবে মনে রাখবেন যে ক) যে পুরানোআরিকে পরিবর্তিত concatকরে সেখানে নয় (যাতে কোনটি আপনার পরিস্থিতির জন্য নির্ভর করে) এবং খ) এটি কেবল একটি উপাদান সন্নিবেশ করে।
মিগিয়াকা

1
বাহ, এটা অনেক ধীর। ঠিক আছে, যেমনটি আমি বলেছি, এটি অ্যারের একটি অনুলিপি তৈরি করছে (এবং একটি নতুন [0]অ্যারেও তৈরি করছে ), যেখানে আনশিফ্ট এটিকে স্থান পরিবর্তন করছে। তবে উভয়ই ও (এন) হওয়া উচিত। এছাড়াও সেই সাইটের লিঙ্কটির জন্য চিয়ার্স - খুব সহজ দেখাচ্ছে।
mgiuca

2
অনেলাইনারের পক্ষে এটি ভাল, যেহেতু কনক্যাট অ্যারেটি দেয় এবং
আনশিফ্টটি

32

আপনি যদি অ্যারে (a1 এ অ্যারের সাথে a1) প্রেন্ডেন্ড করতে চান তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

var a1 = [1, 2];
var a2 = [3, 4];
Array.prototype.unshift.apply(a1, a2);
console.log(a1);
// => [3, 4, 1, 2]

6

f আপনাকে পুরানো অ্যারে সংরক্ষণ করতে হবে, পুরানোটি স্লাইস করতে হবে এবং স্লাইসের শুরুতে নতুন মান (গুলি) সরিয়ে ফেলতে হবে।

var oldA=[4,5,6];
newA=oldA.slice(0);
newA.unshift(1,2,3)

oldA+'\n'+newA

/*  returned value:
4,5,6
1,2,3,4,5,6
*/

4

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

তবে এই পরিস্থিতিটি কেবল ক্রোম ব্রাউজারের জন্যই বাস্তব। ফায়ারফক্সে আনশিফ্টটিতে দুর্দান্ত এক অপ্টিমাইজেশন রয়েছে এবং এটি সব ক্ষেত্রেই দ্রুত।

ES6 স্প্রেড সমস্ত ব্রাউজারে 100+ গুণ ধীর।

https://jsbench.me/cgjfc79bgx/1


দুর্দান্ত উত্তর! তবে আপনি এর অংশটি হারাবেন না তা নিশ্চিত করার জন্য, আপনি এখানে আপনার পরীক্ষার কেসগুলি পুনরায় উত্পাদন করতে পারেন (সম্ভবত কয়েকটি নমুনা চালানোর ফলাফল সহ) যেমন জেএসবেঞ্চ চলে যায়।
ruffin

3

বিশেষ পদ্ধতি রয়েছে:

a.unshift(value);

আপনি যদি অ্যারেটিতে বেশ কয়েকটি উপাদানকে পূর্বে চাপ দিতে চান তবে এই জাতীয় পদ্ধতিটি ব্যবহার করা আরও দ্রুত হবে:

var a = [1, 2, 3],
    b = [4, 5];

function prependArray(a, b) {
    var args = b;
    args.unshift(0);
    args.unshift(0);
    Array.prototype.splice.apply(a, args);
}

prependArray(a, b);
console.log(a); // -> [4, 5, 1, 2, 3]

2
না ... আনশিফ্টটি প্রথম যুক্তি হিসাবে অ্যারে যুক্ত করবে: var a = [4, 5]; a.unshift ([1,2,3]); console.log (ক); // -> [[4, 5], 1, 2, 3]
বোজরান্দ

4
আপনি সঠিক! আপনার প্রয়োজন হবেArray.prototype.unshift.apply(a,b);
ডেভিড


1

কল করা unshiftকেবলমাত্র নতুন অ্যারের দৈর্ঘ্য দেয়। সুতরাং, শুরুতে একটি উপাদান যুক্ত করতে এবং একটি নতুন অ্যারে ফিরিয়ে আনতে, আমি এটি করেছি:

let newVal = 'someValue';
let array = ['hello', 'world'];
[ newVal ].concat(array);

বা কেবল স্প্রেড অপারেটর সহ:

[ newVal, ...array ]

এইভাবে, আসল অ্যারেটি অচ্ছুত থাকে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.