কোনও নতুন অ্যারে তৈরি না করে কীভাবে বিদ্যমান জাভাস্ক্রিপ্ট অ্যারেটিকে অন্য অ্যারে দিয়ে প্রসারিত করা যায়


970

বিদ্যমান জাভাস্ক্রিপ্ট অ্যারেটিকে অন্য অ্যারের সাথে প্রসারিত করার অর্থ নেই, অর্থ্যাৎ পাইথনের অনুকরণ করা extend পদ্ধতি করার।

আমি নিম্নলিখিতগুলি অর্জন করতে চাই:

>>> a = [1, 2]
[1, 2]
>>> b = [3, 4, 5]
[3, 4, 5]
>>> SOMETHING HERE
>>> a
[1, 2, 3, 4, 5]

আমি জানি একটি a.concat(b)পদ্ধতি আছে তবে এটি প্রথমটি প্রসারিত করার পরিবর্তে একটি নতুন অ্যারে তৈরি করে। আমি এমন একটি অ্যালগরিদম চাই যা দক্ষতার সাথে কার্যকর হয় যখন aতার তুলনায় উল্লেখযোগ্যভাবে বড় হয় b( যেমনটি অনুলিপি করে না a)।

দ্রষ্টব্য: এটি কোনও অ্যারেতে কীভাবে সংযোজন করা যায় তার নকল নয় ? - এখানে লক্ষ্যটি হ'ল একটি অ্যারের পুরো সামগ্রীর অপরটিতে যুক্ত করা এবং এটি "স্থানে" করা, অর্থাৎ বর্ধিত অ্যারের সমস্ত উপাদান অনুলিপি না করেই করা।


5
@ একটি উত্তরে টুথব্রাশ এর মন্তব্য থেকে: a.push(...b)। এটি শীর্ষ উত্তরের মত ধারণার মতো, তবে ইএস 6-এর জন্য আপডেট updated
tscizzle

উত্তর:


1497

.pushপদ্ধতি একাধিক আর্গুমেন্ট গ্রহণ করতে পারেন। আপনি দ্বিতীয় অ্যারের সমস্ত উপাদানকে যুক্তি হিসাবে পাস করতে স্প্রেড অপারেটরটি ব্যবহার করতে পারেন .push:

>>> a.push(...b)

যদি আপনার ব্রাউজারটি ECMAScript 6 সমর্থন করে না, আপনি .applyপরিবর্তে ব্যবহার করতে পারেন :

>>> a.push.apply(a, b)

অথবা সম্ভবত, আপনি যদি এটি আরও স্পষ্ট মনে করেন:

>>> Array.prototype.push.apply(a,b)

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


3
আমি মনে করি এটি আপনার সেরা বাজি। অন্য যে কোনও কিছুর পুনরাবৃত্তি বা প্রয়োগের অন্য প্রচেষ্টা জড়িত হতে চলেছে
পিটার বেইলি

44
এই উত্তরটি "বি" (দ্বারা প্রসারিত অ্যারে) বড় হলে (> আমার পরীক্ষাগুলি অনুসারে ক্রোমে প্রায় 150000 এন্ট্রি) ব্যর্থ হবে। আপনার লুপের জন্য একটি ব্যবহার করা উচিত, বা "বি" তে ইনবিল্ট "ফরএচ" ফাংশনটি আরও ভাল ব্যবহার করা উচিত। আমার উত্তর দেখার stackoverflow.com/questions/1374126/...
jcdude

35
@ ডিকিং: অ্যারের pushপদ্ধতিটি যে কোনও সংখ্যক আর্গুমেন্ট নিতে পারে, তারপরে অ্যারের পিছনে চাপানো হয় । সুতরাং a.push('x', 'y', 'z')একটি বৈধ কল যা a3 টি উপাদান দ্বারা প্রসারিত হবে । applyকোনও ক্রিয়াকলাপের একটি পদ্ধতি যা কোনও অ্যারে নেয় এবং এর উপাদানগুলি এমনভাবে ব্যবহার করে যেন সেগুলি ফাংশনে অবস্থানিক উপাদান হিসাবে স্পষ্টভাবে দেওয়া হয়েছিল। সুতরাং a.push.apply(a, ['x', 'y', 'z'])3 উপাদান দ্বারা অ্যারের প্রসারিত হবে। তদ্ব্যতীত, applyপ্রথম যুক্তি হিসাবে একটি প্রসঙ্গ নেয় (আমরা aআবার যুক্ত হয়ে সেখানে প্রবেশ করি a)।
ডিজিনএক্স

দ্রষ্টব্য: এই দৃশ্যে, প্রথম ফেরতের মান [1,2,3,4,5] নয় 5 তবে a == [1,2,3,4,5] পরে]
জাওউ

1
তবুও অন্য সামান্য কম বিভ্রান্তিকর (এবং অনেক না আর) আবাহন হবে: [].push.apply(a, b)
niry

259

আপডেট 2018 : একটি ভাল উত্তর খনি এর নতুন এক : a.push(...b)। এটি আর উত্সাহিত করবেন না, কারণ এটি সত্যই প্রশ্নের উত্তর দেয় না, তবে এটি ছিল গুগলের প্রথম হিট :)


যারা কেবল "জাভাস্ক্রিপ্ট অ্যারে প্রসারিত" অনুসন্ধান করেছেন এবং এখানে পেয়েছেন তাদের জন্য, আপনি খুব ভাল ব্যবহার করতে পারেন Array.concat

var a = [1, 2, 3];
a = a.concat([5, 4, 3]);

থানক স্টার্টারটি চায়নি বলে কনক্যাট নতুন ক্রেটির একটি অনুলিপি ফিরিয়ে দেবে। তবে আপনি যত্ন নাও করতে পারেন (অবশ্যই বেশিরভাগ ধরণের ব্যবহারের জন্য এটি ভাল হবে)।


স্প্রেড অপারেটরের আকারে এর জন্য কিছু দুর্দান্ত ইসসিএমএসক্রিপ্ট 6 চিনি রয়েছে:

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

(এটিও অনুলিপি করে))


43
প্রশ্নটি পরিষ্কারভাবে জানিয়েছিল: "নতুন অ্যারে তৈরি না করে?"
উইল্ট

10
@ উইল্ট: এটি সত্য, উত্তরটি কেন বলেছেন যদিও :) এটি গুগলে দীর্ঘদিন ধরে প্রথম আঘাত হয়েছিল। এছাড়াও অন্যান্য সমাধানগুলি কুশ্রী ছিল, আদর্শিক এবং সুন্দর কিছু চাইছিল। যদিও আজকাল এটি arr.push(...arr2)নতুন এবং আরও ভাল এবং এই নির্দিষ্ট প্রশ্নের একটি প্রযুক্তিগত সঠিক (টিএম) উত্তর।
ওডিনহো - ভেলমন্ট

7
আমি আপনাকে শুনছি, তবে আমি "নতুন অ্যারে তৈরি না করে জাভাস্ক্রিপ্ট অ্যাপেন্ডি অ্যারে" অনুসন্ধান করেছি , তবে এটা দেখে দুঃখ হয় যে 60০ গুণ উচ্চতর উত্তর যে উচ্চতর উত্তরটি প্রকৃত প্রশ্নের উত্তর দেয় না;) আমি নীচে নামি না, যেহেতু আপনি আপনার উত্তরে এটি পরিষ্কার করে দিয়েছেন।
'

202

আপনার লুপ-ভিত্তিক কৌশলটি ব্যবহার করা উচিত। ব্যবহারের উপর ভিত্তি করে এই পৃষ্ঠায় অন্যান্য উত্তর.apply বড় অ্যারেগুলিতে ব্যর্থ হতে পারে।

মোটামুটি ক্ষুদ্র লুপ-ভিত্তিক বাস্তবায়ন হ'ল:

Array.prototype.extend = function (other_array) {
    /* You should include a test to check whether other_array really is an array */
    other_array.forEach(function(v) {this.push(v)}, this);
}

তারপরে আপনি নিম্নলিখিতগুলি করতে পারেন:

var a = [1,2,3];
var b = [5,4,3];
a.extend(b);

ডিজিনএক্সের উত্তর (পুশ.প্লাই ব্যবহার করে) এবং অন্যান্য .applyভিত্তিক পদ্ধতিগুলি ব্যর্থ হয় যখন আমরা সংযুক্ত করছি যে অ্যারে বড় হয় (পরীক্ষাগুলি দেখায় যে আমার জন্য বড়> ক্রোমে প্রায় 150,000 এন্ট্রি এবং ফায়ারফক্সে 500,000 এন্ট্রি রয়েছে)। এই ত্রুটিটি এই jsperf এ ঘটে দেখতে পাবেন

একটি ত্রুটি দেখা দেয় কারণ 'ফাংশন.প্রোটোটাইপ. অ্যাপ্লিকেশন' যখন দ্বিতীয় আর্গুমেন্ট হিসাবে একটি বড় অ্যারের সাথে কল করা হয় তখন কল স্ট্যাকের আকার অতিক্রম করা হয়। (এমডিএন ব্যবহার করে কল স্ট্যাকের আকারকে ছাড়িয়ে যাওয়ার ঝুঁকির বিষয়ে একটি নোট রয়েছে Function.prototype.apply - খেতাবধারী অধ্যায় দেখুন "প্রয়োগ এবং বিল্ট-ইন ফাংশন"।)

এই পৃষ্ঠায় অন্যান্য উত্তরের সাথে গতির তুলনা করার জন্য, এই jsperf দেখুন ( ইটারঅফকোডকে ধন্যবাদ)। লুপ-ভিত্তিক বাস্তবায়ন ব্যবহারের গতিতে সমান Array.push.apply, তবে এর চেয়ে কিছুটা ধীর গতিতে থাকেArray.slice.apply

মজার বিষয় হল, আপনি যে অ্যারে সংযোজন করছেন তা যদি অল্প হয় তবে forEachউপরের ভিত্তিক পদ্ধতিটি স্পারসিটির সুবিধা নিতে পারে এবং.apply ভিত্তিক পদ্ধতিগুলিকে ; খুঁজে বার করো এই jsperf আপনি নিজেকে এই পরীক্ষা করার চান।

যাইহোক, প্রতিটি বাস্তবায়ন এখানে আরও ছোট করার জন্য (যেমন আমি ছিলাম!) প্রলোভিত হবেন না:

Array.prototype.extend = function (array) {
    array.forEach(this.push, this);
}

কারণ এতে আবর্জনার ফলাফল হয়! কেন? কারণ Array.prototype.forEachএটি যে ফাংশনটি কল করে তার জন্য তিনটি আর্গুমেন্ট সরবরাহ করে - এগুলি হ'ল: (উপাদান_মূল্য, এলিমেন্ট_ইন্ডেক্স, উত্স_আরে) ray forEachযদি আপনি "forEach (this.push, this)" ব্যবহার করেন তবে প্রতিটিই পুনরাবৃত্তির জন্য এগুলি সমস্তই আপনার প্রথম অ্যারেতে ঠেলে দেওয়া হবে !


1
: পরীক্ষা কিনা other_array সত্যিই, একটি অ্যারের হয় PS অপশনের একটি বর্ণনা এখানে নির্বাচন করেছেন stackoverflow.com/questions/767486/...
jcdude

6
ভাল উত্তর. আমি এই সমস্যা সম্পর্কে সচেতন ছিলাম না। আমি আপনার উত্তর এখানে উদ্ধৃত করেছি: stackoverflow.com/a/4156156/96100
টিম ডাউন

2
.push.apply.forEachভি 8 এর তুলনায় আসলে খুব দ্রুত , দ্রুততম এখনও একটি ইনলাইন লুপ।
বেনিয়ামিন গ্রুইনবাউম

1
@ বেনজামিন গ্রুয়েনবাউম - আপনি কি কিছু ফলাফলের লিঙ্ক পোস্ট করতে পারবেন? যতদূর আমি এই মন্তব্যের শেষে লিঙ্কিত জেএসপিআইফির সংগৃহীত ফলাফলগুলি থেকে দেখতে পাচ্ছি, ক্রোম / ক্রোমিয়ামের .forEachতুলনায় দ্রুত ব্যবহার করা .push.apply( ভি 25 এর পরে সমস্ত সংস্করণে) ব্যবহার করা দ্রুত । আমি বিচ্ছিন্নভাবে ভি 8 পরীক্ষা করতে সক্ষম হইনি, তবে আপনার যদি থাকে তবে আপনার ফলাফলগুলি লিঙ্ক করুন। Jsperf দেখুন: jsperf.com/array-extending-push-vs-concat/5
jcdude

1
@jcdude আপনার jsperf অবৈধ। আপনার অ্যারেতে সমস্ত উপাদান যেমন রয়েছে undefinedতেমনি .forEachএগুলি এড়িয়ে যাবে এবং এটিকে দ্রুত তৈরি করবে। .spliceআসলে সবচেয়ে দ্রুত ?! jsperf.com/array-extending-push-vs-concat/18
ইটারঅফকোড

152

আমি এই দিনগুলিকে সবচেয়ে মার্জিত মনে করছি:

arr1.push(...arr2);

বিস্তার অপারেটর উপর MDN নিবন্ধ ES2015 (ES6) এ এই সুন্দর শর্করাবৎ উপায় উল্লেখ:

একটি ভাল ধাক্কা

উদাহরণ: প্রায়শই বিদ্যমান অ্যারেটির শেষে একটি অ্যারে ধাক্কা দিতে ব্যবহৃত হয় push ES5 এ এটি প্রায়শই করা হয়:

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
// Append all items from arr2 onto arr1
Array.prototype.push.apply(arr1, arr2);

ES6 এ স্প্রেড সহ এটি হয়ে যায়:

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1.push(...arr2);

মনে রাখবেন যে arr2বিশাল হতে পারে না (এটি প্রায় 100 000 আইটেমের নীচে রাখুন), কারণ জ্যাকডুডের উত্তর অনুসারে কল স্ট্যাক উপচে পড়েছে।


1
আমি স্রেফ একটি ভুল থেকে একটি সতর্কতা করেছি। ES6 সংস্করণ খুব কাছাকাছি arr1.push(arr2)। এটি এর মতো সমস্যা হতে পারে arr1 = []; arr2=['a', 'b', 'd']; arr1.push(arr2)ফলে arr1 == [['a','b','d']]দুটি অ্যারে একত্রিত না হয়ে ফলাফল অ্যারের অ্যারে হয়। এটি করা সহজ ভুল। আমি এই কারণে নীচে আপনার দ্বিতীয় উত্তর পছন্দ। stackoverflow.com/a/31521404/4808079
সেফ রিড

ব্যবহার করার সময় একটি সুবিধা .concatরয়েছে যে দ্বিতীয় যুক্তিটি অ্যারে হওয়া উচিত নয়। এটি স্প্রেড অপারেটরের সাথে concatউদাহরণস্বরূপ একত্রিত করে এটি অর্জন করা যেতে পারেarr1.push(...[].concat(arrayOrSingleItem))
স্টিভেন প্রবিলিনস্কি

লক্ষ্যগুলির অ্যারেটি খালি নয় এমন ক্ষেত্রে এটি আধুনিক, মার্জিত জাভাস্ক্রিপ্ট।
টিম্বো

এটি কি যথেষ্ট দ্রুত?
রোল 5

@ রোলডেলোস রেয়েস: হ্যাঁ
ওডিনহো - ভেলমন্ট

46

apply()জাভাস্ক্রিপ্টে প্রথমে কয়েকটি শব্দ যা আমরা এটি ব্যবহার করি তা বুঝতে সহায়তা করার জন্য:

apply()পদ্ধতি একটি প্রদত্ত সঙ্গে একটি ফাংশন কল thisমান, এবং আর্গুমেন্ট একটি অ্যারের হিসাবে প্রদান করা।

অ্যারেতে আইটেমগুলির একটি তালিকা যুক্ত করার জন্য পুশ আশা করে। apply()পদ্ধতি, কিন্তু, একটি অ্যারের হিসাবে ফাংশন কল জন্য প্রত্যাশিত আর্গুমেন্ট লাগে। এটি আমাদের সহজেই pushবিল্টিনের সাহায্যে একটি অ্যারের উপাদানগুলিকে অন্য অ্যারে রূপান্তর করতে দেয়push() পদ্ধতির ।

ভাবুন আপনার এই অ্যারেগুলি রয়েছে:

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

এবং কেবল এটি করুন:

Array.prototype.push.apply(a, b);

ফলাফলটি হবে:

a = [1, 2, 3, 4, 5, 6, 7];

ES6 এ একইভাবে স্প্রেড অপারেটর (" ...") ব্যবহার করে করা যেতে পারে :

a.push(...b); //a = [1, 2, 3, 4, 5, 6, 7]; 

খাটো এবং আরও ভাল তবে এই মুহুর্তে সমস্ত ব্রাউজারগুলিতে সম্পূর্ণ সমর্থন নেই supported

এছাড়াও যদি আপনি চান সরানো অ্যারে থেকে সবকিছু bকরতে a, খালি bপ্রক্রিয়ায় আপনি এটা করতে পারেন:

while(b.length) {
  a.push(b.shift());
} 

এবং ফলাফল নিম্নলিখিত হবে:

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

1
বা while (b.length) { a.push(b.shift()); }, ঠিক?
LarsW

37

আপনি যদি jQuery ব্যবহার করতে চান তবে সেখানে $।

উদাহরণ:

a = [1, 2];
b = [3, 4, 5];
$.merge(a,b);

ফলাফল: এ = [1, 2, 3, 4, 5]


1
এর বাস্তবায়ন (উত্স কোডে) কীভাবে খুঁজে পাব jQuery.merge()?
ma11hew28

আমাকে 10 মিনিট সময় নিয়েছে - jQuery ওপেন সোর্স এবং উত্সটি গিথুবে প্রকাশিত হয়েছে। আমি "মার্জ" এর জন্য অনুসন্ধান করেছি এবং এরপরে কোরের.জেএস ফাইলটিতে মার্জ ফাংশনটির সংজ্ঞা বলে মনে হয়েছে তা দেখুন, দেখুন: github.com/jquery/jquery/blob/master/src/core.js#L331
amn

19

আমি a.push.apply(a, b)উপরে বর্ণিত পদ্ধতিটি পছন্দ করি এবং আপনি যদি চান তবে আপনি সর্বদা একটি লাইব্রেরি ফাংশন তৈরি করতে পারেন:

Array.prototype.append = function(array)
{
    this.push.apply(this, array)
}

এবং এটি এটি ব্যবহার করুন

a = [1,2]
b = [3,4]

a.append(b)

6
Push.apply পদ্ধতিটি ব্যবহার করা উচিত নয় কারণ এটি যদি আপনার "অ্যারে" যুক্তিটি একটি বড় অ্যারে (যেমন> Chrome এ ~ 150000 এন্ট্রি) হয় তবে স্ট্যাকের ওভারফ্লো হতে পারে (এবং তাই ব্যর্থ হয়)। আপনি "array.forEach" ব্যবহার করা উচিত - আমার উত্তর দেখুন: stackoverflow.com/a/17368101/1280629
jcdude

12

এটি ব্যবহার করে এটি করা সম্ভব splice():

b.unshift(b.length)
b.unshift(a.length)
Array.prototype.splice.apply(a,b) 
b.shift() // Restore b
b.shift() // 

তবে কুরুচিপূর্ণ হওয়া সত্ত্বেও এটি push.applyফায়ারফক্স 3.0.০-তে কম দ্রুত নয়।


9
আমি একই জিনিস পাওয়া যায়, সংযুক্ত করান প্রায় 10,000 উপাদান অ্যারে পর্যন্ত প্রতিটি আইটেমের ঠেলাঠেলি করতে কর্মক্ষমতা উন্নত উপলব্ধ করা হয় না jsperf.com/splice-vs-push
ড্রিউ

1
+1 এটি এবং পারফরম্যান্স তুলনা যুক্ত করার জন্য ধন্যবাদ, এই পদ্ধতিটি পরীক্ষা করার প্রচেষ্টাটি আমাকে বাঁচিয়েছে।
jjrv

1
Splice.apply বা push.apply ব্যবহার করে অ্যারে বি বড় হলে স্ট্যাকের ওভারফ্লোর কারণে ব্যর্থ হতে পারে। : - তারা একটি "জন্য" বা "foreach" লুপ ব্যবহার তুলনায় ধীর এই jsPerf দেখতে jsperf.com/array-extending-push-vs-concat/5 এবং আমার উত্তর stackoverflow.com/questions/1374126/...
jcdude

4

এই সমাধানটি আমার পক্ষে কাজ করে (ইসিমাস্ক্রিপ্ট 6 এর স্প্রেড অপারেটরটি ব্যবহার করে):

let array = ['my', 'solution', 'works'];
let newArray = [];
let newArray2 = [];
newArray.push(...array); // Adding to same array
newArray2.push([...array]); // Adding as child/leaf/sub-array
console.log(newArray);
console.log(newArray2);


1

আমার নীচের মতো আপনি বাড়ানোর জন্য একটি পলিফিল তৈরি করতে পারেন। এটি অ্যারে যুক্ত করবে; স্থানে এবং নিজেই ফিরে আসুন, যাতে আপনি অন্যান্য পদ্ধতির চেইন করতে পারেন।

if (Array.prototype.extend === undefined) {
  Array.prototype.extend = function(other) {
    this.push.apply(this, arguments.length > 1 ? arguments : other);
    return this;
  };
}

function print() {
  document.body.innerHTML += [].map.call(arguments, function(item) {
    return typeof item === 'object' ? JSON.stringify(item) : item;
  }).join(' ') + '\n';
}
document.body.innerHTML = '';

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

print('Concat');
print('(1)', a.concat(b));
print('(2)', a.concat(b));
print('(3)', a.concat(4, 5, 6));

print('\nExtend');
print('(1)', a.extend(b));
print('(2)', a.extend(b));
print('(3)', a.extend(4, 5, 6));
body {
  font-family: monospace;
  white-space: pre;
}


0

উত্তরগুলির সংমিশ্রণ ...

Array.prototype.extend = function(array) {
    if (array.length < 150000) {
        this.push.apply(this, array)
    } else {
        for (var i = 0, len = array.length; i < len; ++i) {
            this.push(array[i]);
        };
    }  
}

9
না, এটি করার দরকার নেই। ForEach ব্যবহারের জন্য লুপের জন্য A পুশ.প্লাই ব্যবহারের চেয়ে দ্রুত এবং এটি অ্যারের দৈর্ঘ্য কত তা বাড়িয়ে দেয় তা নিয়ে কাজ করে না। আমার সংশোধিত উত্তরটি দেখুন: stackoverflow.com/a/17368101/1280629 যে কোনও ক্ষেত্রে, আপনি কীভাবে জানবেন যে সমস্ত ব্রাউজারগুলির জন্য 150000 সঠিক নম্বরটি ব্যবহার করতে পারে? এটি একটি ফাজ
জে সিডুড

হাঃ হাঃ হাঃ. আমার উত্তরটি অপরিবর্তনীয়, তবে এটি অন্য সময়ে পাওয়া অন্যদের কিছু কম্বো - যা একটি সংক্ষিপ্তসার হিসাবে উপস্থিত বলে মনে হয়। কোনও উদ্বেগ নেই
zCoder

0

আরও দুটি অ্যারে মার্জ করার জন্য আরও একটি সমাধান

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

// Merge the contents of multiple arrays together into the first array
var mergeArrays = function() {
 var i, len = arguments.length;
 if (len > 1) {
  for (i = 1; i < len; i++) {
    arguments[0].push.apply(arguments[0], arguments[i]);
  }
 }
};

তারপরে কল করুন এবং মুদ্রণ করুন:

mergeArrays(a, b, c);
console.log(a)

আউটপুট হবে: Array [1, 2, 3, 4, 5, 6, 7]


-1

উত্তর অত্যন্ত সহজ।

>>> a = [1, 2]
[1, 2]
>>> b = [3, 4, 5]
[3, 4, 5]
>>> SOMETHING HERE
(The following code will combine the two arrays.)

a = a.concat(b);

>>> a
[1, 2, 3, 4, 5]

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

a.concat(b);  <--- This does absolutely nothing since it is just returning the combined arrays, but it doesn't do anything with it.

2
এমডিএন-তে ডক্সে যেমন স্পষ্টভাবে বলা হয়েছে এটি Array.prototype.concat()নতুন অ্যারে ফিরিয়ে দেবে , এটি ওপিকে পরিষ্কারভাবে জিজ্ঞাসা করায় এটি বিদ্যমান অ্যারেতে যুক্ত হবে না।
উইল্ট

-2

> 150,000 রেকর্ডের Array.extendপরিবর্তে ব্যবহার করুন Array.push

if (!Array.prototype.extend) {
  Array.prototype.extend = function(arr) {
    if (!Array.isArray(arr)) {
      return this;
    }

    for (let record of arr) {
      this.push(record);
    }

    return this;
  };
}

-6

খুব সহজ, স্প্রেড অপারেটরগুলির উপর নির্ভর করে না বা প্রয়োগ করে না, যদি এটি কোনও সমস্যা হয়।

b.map(x => a.push(x));

এটিতে কিছু পারফরম্যান্স পরীক্ষা চালানোর পরে, এটি মারাত্মকভাবে ধীরে ধীরে, তবে নতুন অ্যারে তৈরি না করার বিষয়ে প্রশ্নের উত্তর দেয়। কনক্যাটটি উল্লেখযোগ্যভাবে দ্রুত, এমনকি jQuery এর হুফও $.merge()

https://jsperf.com/merge-arrays19b/1


4
আপনি যদি রিটার্ন মানটি ব্যবহার না করে থাকেন তবে তার .forEachপরিবর্তে আপনার ব্যবহার করা উচিত .map। এটি আপনার কোডের উদ্দেশ্যটি আরও ভালভাবে জানায়।
ডেভিড

@ ডেভিড - প্রত্যেকে তাদের নিজস্ব। আমি এর সিনাক্স পছন্দ করি .mapতবে আপনি তা করতেও পারেন b.forEach(function(x) { a.push(x)} )। আসলে আমি এটিকে জোসফারফ টেস্টে যুক্ত করেছি এবং এটি মানচিত্রের চেয়ে দ্রুত একটি চুল। তবু সুপার ধীর।
এলপাস্টার

3
এটি পছন্দসই বিষয় নয়। এই 'কার্যকরী' পদ্ধতির প্রত্যেকটির সাথে সম্পর্কিত একটি নির্দিষ্ট অর্থ রয়েছে। .mapএখানে কল করা খুব অদ্ভুত দেখাচ্ছে। এটা কল করার মত হবে b.filter(x => a.push(x))। এটি কাজ করে, তবে পাঠককে বিভ্রান্ত করে বোঝায় যে কিছু হচ্ছে না তখন।
ডেভিড

2
@ এলপাস্টার এটি আপনার সময়ের জন্য উপযুক্ত হওয়া উচিত, কারণ আমার মতো আরও কিছু লোক বসে বসে তার ঘাড়ে আঁচড়ো করে ভাবছিল যে আপনার কোডে তিনি কী দেখতে পাচ্ছেন না সেখানে কী ঘটছে। বেশিরভাগ সাধারণ ক্ষেত্রে, এটি অভিপ্রায়টির স্পষ্টতা যা গুরুত্বপূর্ণ, কর্মক্ষমতা নয়। যারা আপনার কোডটি পড়েন তাদের সময়কে সম্মান করুন, কারণ আপনি যখন একমাত্র হন তখন তারা অনেকের হতে পারে। ধন্যবাদ।
Dmytro Y.

1
@ এলপাস্টার আমি জানি ঠিক কী .map()হয় এবং এটিই সমস্যা। এই জ্ঞানটি আমাকে ভাবতে বাধ্য করে যে আপনার ফলস্বরূপ অ্যারে প্রয়োজন, অন্যথায় .forEach()কলব্যাক ফাংশনটির পার্শ্ব প্রতিক্রিয়া সম্পর্কে পাঠককে সতর্ক করার জন্য এটি ব্যবহার করা ভাল । আপনার সমাধানটি কঠোরভাবে বলতে প্রাকৃতিক সংখ্যাগুলির একটি অতিরিক্ত অ্যারে তৈরি করে (ফলাফল push), যখন প্রশ্নটি বলে: "নতুন অ্যারে তৈরি না করে"।
Dmytro Y.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.