এন অ্যারে সংঘবদ্ধ করার সবচেয়ে কার্যকরী উপায় কী?


251

জাভাস্ক্রিপ্টে বস্তুর এন অ্যারে সংযুক্ত করার সবচেয়ে কার্যকরী উপায় কী?

অ্যারেগুলি পরিবর্তনযোগ্য এবং ফলাফল ইনপুট অ্যারেগুলির মধ্যে একটিতে সংরক্ষণ করা যেতে পারে।


উত্তর:


323

আপনি যদি দুটিরও বেশি অ্যারে সংশ্লেষ করেন তবে concat()সুবিধার্থে এবং সম্ভাব্য পারফরম্যান্সে যাওয়ার উপায়।

var a = [1, 2], b = ["x", "y"], c = [true, false];
var d = a.concat(b, c);
console.log(d); // [1, 2, "x", "y", true, false];

মাত্র দুটি অ্যারে pushযুক্ত করার জন্য, অ্যারেতে যুক্ত হওয়া উপাদানগুলির সমন্বয়ে একাধিক যুক্তি গ্রহণ করার বিষয়টি সত্য হিসাবে নতুন অ্যারে তৈরি না করে এক অ্যারে থেকে অন্য প্রান্তে উপাদান যুক্ত করার পরিবর্তে ব্যবহার করা যেতে পারে। সঙ্গে slice()এটাও পরিবর্তে ব্যবহার করা যেতে পারে concat()কিন্তু এই কাজ থেকে কোনো কর্মক্ষমতা সুবিধা উপস্থিত হতে পারে

var a = [1, 2], b = ["x", "y"];
a.push.apply(a, b);
console.log(a); // [1, 2, "x", "y"];

ECMAScript 2015 এবং তারপরে, এটি আরও আরও কমে যেতে পারে

a.push(...b)

তবে, মনে হচ্ছে যে বড় অ্যারেগুলির জন্য (১০,০০,০০০ সদস্য বা তার বেশি সদস্যের ক্রম) এর জন্য, উপাদানগুলির একটি অ্যারে পাস করার কৌশলটি push(হয় ব্যবহার করা হবে apply()বা ECMAScript 2015 স্প্রেড অপারেটর) ব্যর্থ হতে পারে। এই জাতীয় অ্যারেগুলির জন্য, একটি লুপ ব্যবহার করা আরও ভাল পদ্ধতির। বিশদ জানতে https://stackoverflow.com/a/17368101/96100 দেখুন ।


1
আমি বিশ্বাস করি আপনার পরীক্ষায় একটি ত্রুটি থাকতে পারে: a.concat(b)পরীক্ষার কেসটি অযথাই অ্যারের একটি অনুলিপি তৈরি করে aতা ফেলে দেওয়ার মতো বলে মনে হচ্ছে ।
নিনজাগেকো

1
@ নিনজাগেকো: আপনি ঠিক বলেছেন। আমি এটি আপডেট করেছি: jsperf.com/concatperftest/6 । একটি নতুন অ্যারে তৈরির ক্ষেত্রে বিশেষভাবে দুটি বিদ্যমান অ্যারে যুক্ত করে, এটি concat()সাধারণত দ্রুত হয় বলে মনে হয়। স্থানে বিদ্যমান অ্যারেতে একটি অ্যারে সংশ্লেষ করার ক্ষেত্রে, push()যাওয়ার উপায়। আমি আমার উত্তর আপডেট।
টিম ডাউন

16
আমি প্রমাণ করতে পারি যে পুশ.প্লাই পদ্ধতিটি ব্যবহার করে বেশ কয়েকটি নতুন অ্যারে সহ একক অ্যারে বাড়ানো সহজ কন্টাক্ট কলের তুলনায় বিশাল পারফরম্যান্স সুবিধা (~ 100x) প্রদান করে। আমি পূর্ণসংখ্যার সংক্ষিপ্ত তালিকার খুব দীর্ঘ তালিকাগুলি, v8 / node.js এ কাজ করছি।
chbrown

1
আরও সংক্ষিপ্ত উপায় হ'ল a.push (... খ);
dinvlad

1
@ জিনভ্লাদ: সত্য, তবে কেবল ES6 পরিবেশে। আমি আমার উত্তরে একটি নোট যুক্ত করেছি।
টিম ডাউন

158
[].concat.apply([], [array1, array2, ...])

সম্পাদনা : দক্ষতার প্রমাণ: http://jsperf.com/m Multi-array-concat/7

সম্পাদনা 2 : টিম সুপিনি মন্তব্যগুলিতে উল্লেখ করেছেন যে এর ফলে দোভাষীকে কল স্ট্যাকের আকার ছাড়িয়ে যেতে পারে। এটি সম্ভবত জেএস ইঞ্জিনের উপর নির্ভরশীল, তবে আমি কমপক্ষে Chrome এ "সর্বাধিক কল স্ট্যাকের আকারও অতিক্রম করে" পেয়েছি। টেস্ট কেস: [].concat.apply([], Array(300000).fill().map(_=>[1,2,3]))। (আমি বর্তমানে স্বীকৃত উত্তরটি ব্যবহার করে একই ত্রুটিটিও অর্জন করেছি, সুতরাং কেউ এ জাতীয় ব্যবহারের ক্ষেত্রে প্রত্যাশা করছেন বা অন্যের জন্য একটি গ্রন্থাগার তৈরি করছেন, আপনি যে সমাধানটি বেছে নেবেন তা বিবেচনা না করেই বিশেষ পরীক্ষার প্রয়োজন হতে পারে))


3
@ c69: কমপক্ষে Chrome এ বারবার .push (#, #, ..., #) এর নির্বাচিত উত্তরের মতো কার্যকর বলে মনে হচ্ছে। jsperf.com/multi-array-concat টিম ডাউন দ্বারা নির্বাচিত উত্তরটির মধ্যে এটির একটি ত্রুটিও থাকতে পারে। এই লিঙ্কটি একাধিক অ্যারে যোগদানের পারফরম্যান্স তুলনা যা প্রশ্ন জিজ্ঞাসা করা হয়েছে (কেবল ২ নয়); একাধিক সম্ভাব্য দৈর্ঘ্য পরীক্ষা করা হয়।
নিনজাগেকো

আইএমও এটি "মার্জ" করার সবচেয়ে কার্যকর উপায় এন অ্যারে, খুব ভাল হয়েছে
এরিক উল্ডল

এই উত্তরটি বিশেষত কার্যকর যখন এন এর আগে সময়ের আগে জানা ছিল না যেমন আপনার যখন স্বেচ্ছাসেবী দৈর্ঘ্যের অ্যারে থাকে এবং আপনি সেগুলি সমস্ত মনযোগী করতে চান।
jਫਰ00

3
ES6 এবং স্প্রেড অপারেটরগুলির সাথে এটি আরও সহজতর হয়: [] .কনক্যাট (... [অ্যারে 1, অ্যারে 2, ...]) আচ্ছা, দ্বিতীয় তিনটি বিন্দুটি কিছুটা দুর্ভাগ্যজনক। প্রথম তিন বিস্তার অপারেটর developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
Eydrian

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

34

ES2015 (ES6) ব্যবহারকারীদের জন্য

আপনি এখন স্প্রে সিনট্যাক্স ব্যবহার করতে পারবেন অ্যারেগুলিকে সংযুক্ত করতে:

const arr1 = [0, 1, 2],
      arr2 = [3, 4, 5];

const result1 = [...arr1, ...arr2]; // -> [0, 1, 2, 3, 4, 5]

// or...

const result2 = [...arr2, ...arr1]; // -> [3, 4, 5, 0, 1, 2]

এটি কতটা দক্ষ? আমি যা যা পরীক্ষা করেছি তা অবজেক্টসযুক্ত অ্যারেগুলির জন্য খুব ধীর, দেখুন: jsperf.com/array-concat-vs-array-push-vs-array-spread/1
হিটটোডেস্ট্রাক্ট

28

concat()পদ্ধতি দুই বা ততোধিক অ্যারে যোগদানের জন্য ব্যবহার করা হয়। এটি বিদ্যমান অ্যারেগুলিকে পরিবর্তন করে না, এটি কেবল যুক্ত অ্যারেগুলির একটি অনুলিপি প্রদান করে।

array1 = array1.concat(array2, array3, array4, ..., arrayN);

1
কখনও কখনও আমি জাভাস্ক্রিপ্ট ঘৃণা করি মূল অ্যারে modyfying না করার জন্য। 🙄
ভিনসেন্ট হচ-ড্রেই

@ ভিনসেন্টহচ-ড্রাই concatমূলত অ্যারেটি পরিবর্তন না করে নতুন অ্যারে তৈরির জন্য বিশেষত ব্যবহৃত হয়। আপনি যদি আপডেট করতে চান তবে আপনাকে array1ব্যবহার করতে হবেarray1.push(...array2, ...array3, ...array4)
আদিগা

24

একাধিক অ্যারের উপসংহার পরিচালনা করতে অ্যারে.প্রোটোটাইপ.কনকাট. অ্যাপ্লিকেশন ব্যবহার করুন:

var resultArray = Array.prototype.concat.apply([], arrayOfArraysToConcat);

উদাহরণ:

var a1 = [1, 2, 3],
    a2 = [4, 5],
    a3 = [6, 7, 8, 9];
Array.prototype.concat.apply([], [a1, a2, a3]); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

1
আমার এটা ভাল লেগেছে! একত্রিত করার জন্য চলক সংখ্যক অ্যারে দিয়ে সহজেই কাজ করে। +1
জোয়েল

14

আপনি যদি মানচিত্র / ফিল্টার / বাছাই ইত্যাদির মাধ্যমে ফলাফলটি পাইপিংয়ের মাঝখানে থাকেন এবং আপনি অ্যারের অ্যারেটি কনক্যাট করতে চান তবে আপনি ব্যবহার করতে পারেন reduce

let sorted_nums = ['1,3', '4,2']
  .map(item => item.split(','))   // [['1', '3'], ['4', '2']]
  .reduce((a, b) => a.concat(b))  // ['1', '3', '4', '2']
  .sort()                         // ['1', '2', '3', '4']

14

একাধিক অ্যারে এবং ES6 অ্যারের জন্য, ব্যবহার করুন

Array.prototype.concat(...arr);

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

const arr = [[1, 2, 3], [4, 5, 6], [7, 8 ,9]];
const newArr = Array.prototype.concat(...arr);
// output: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

1
এছাড়াও আপনি ব্যবহার করে সদৃশ উপাদানগুলি মুছে ফেলতে পারেন newArr = Array.from(new Set(newArr));
দারিয়াস এম

টাইপ স্ক্রিপ্ট এ কেন হয়ে যায় any[]? টাইপিং আছে - অদ্ভুত।
সাইমন_উইভার

বৃহত্তর অ্যারে ভলিউমগুলিতে এটি আসলে বেশ মারাত্মকভাবে অদক্ষ ine jsperf.com/flatten-array-203948 [].concat.apply([], ...arr) বড় পরিমাণে আরও ভাল অভিনয় করে।
কোলেমার্স

7

এখন আমরা একাধিক অ্যারে ব্যবহার করে একত্রিত করতে পারি ES6 Spreadconcat()অ্যারেগুলিকে সংযুক্ত করার পরিবর্তে একাধিক অ্যারেকে এক সমতল অ্যারেগুলিতে একত্রিত করতে স্প্রেড সিনট্যাক্স ব্যবহার করে চেষ্টা করুন। উদাহরণ:

var a = [1,2];
var b = [3,4];
var c = [5,6,7];
var d = [...a, ...b, ...c];
// resulting array will be like d = [1,2,3,4,5,6,7]

5

এই মত সমাধান।

let arr = [[1, 2], [3, 4], [5, 6]];
 console.log([].concat(...arr));

নিখুঁত সমাধান.
নেহেম

4

পারফোনেন্স তুলনা করতে আপনি jsperf.com সাইট ব্যবহার করতে পারেন । এখানে কনকটের লিঙ্ক is

এর মধ্যে যোগ করা তুলনা:

var c = a.concat(b);

এবং:

var c = [];
for (i = 0; i < a.length; i++) {
    c.push(a[i]);
}
for (j = 0; j < b.length; j++) {
    c.push(b[j]);
}

দ্বিতীয়টি ক্রোমে প্রায় 10 গুণ ধীর।


তবে আপনি ব্যবহার করতে পারেন push.apply()যা concat()ক্রোম ব্যতীত অন্য ব্রাউজারগুলির চেয়ে দ্রুত বলে মনে হচ্ছে । আমার উত্তর দেখুন।
টিম ডাউন


3

এখানে একটি ফাংশন রয়েছে যার মাধ্যমে আপনি একাধিক অ্যারে সংযুক্ত করতে পারেন ate

function concatNarrays(args) {
    args = Array.prototype.slice.call(arguments);
    var newArr = args.reduce( function(prev, next) {
       return prev.concat(next) ;
    });

    return newArr;
}

উদাহরণ -

console.log(concatNarrays([1, 2, 3], [5, 2, 1, 4], [2,8,9]));

আউটপুট হবে

[1,2,3,5,2,1,4,2,8,9]

2

আপনার যদি অ্যারের অ্যারে থাকে এবং উপাদানগুলিকে একক অ্যারেতে সংমিশ্রিত করতে চান তবে নিম্নলিখিত কোডটি চেষ্টা করুন (ES2015 প্রয়োজন):

let arrOfArr = [[1,2,3,4],[5,6,7,8]];
let newArr = [];
for (let arr of arrOfArr) {
    newArr.push(...arr);
}

console.log(newArr);
//Output: [1,2,3,4,5,6,7,8];

বা যদি আপনি কার্যকরী প্রোগ্রামিংয়ে থাকেন

let arrOfArr = [[1,2,3,4],[5,6,7,8]];
let newArr = arrOfArr.reduce((result,current)=>{
    result.push(...current);
    return result;
});

console.log(newArr);
//Output: [1,2,3,4,5,6,7,8];

অথবা স্প্রেড অপারেটর ছাড়াই ইএস 5 সিনট্যাক্সের সাথে আরও ভাল

var arrOfArr = [[1,2,3,4],[5,6,7,8]];
var newArr = arrOfArr.reduce((result,current)=>{
    return result.concat(current);
});
console.log(newArr);
//Output: [1,2,3,4,5,6,7,8];

আপনি যদি না জানেন তবে এই উপায়টি কার্যকর y কোড সময় অ্যারে।


2

ES6 দিয়ে সংক্ষিপ্ত করুন।

new Set([].concat(...Array));

এটি একত্রে এবং একাধিক অ্যারে অনন্য করে;

কোডেপেনে ডেমো


এটি করে তবে এটি সদৃশ অপসারণ করে .. যদি আমি নকল অ্যারেগুলি সরাতে চাই না তবে কী হবে?
ক্রুনাল শাহ

new Set()সদৃশ আইটেম সরিয়ে না। শুধু এটি অপসারণ। [].concat(...Array)
রোনাল্ডটিজি

আমি নতুন সেট ([]। কনক্যাট (... অ্যারে)) ব্যবহার করতে চাই; তবে আমি এটির সাথে একক অভিব্যক্তিতে সদৃশও সরাতে চাই। এটা কি সম্ভব ?
ক্রুনাল শাহ

2

পুশের সাথে অ্যারে মার্জ করুন :

const array1 = [2, 7, 4];
const array2 = [3, 5,9];
array1.push(...array2);
console.log(array1)

কনক্যাট এবং স্প্রেড অপারেটর ব্যবহার :

const array1 = [1,2];
const array2 = [3,4];

// Method 1: Concat 
const combined1 = [].concat(array1, array2);

// Method 2: Spread
const combined2 = [...array1, ...array2];

console.log(combined1);
console.log(combined2);


1

যেখানে 'এন' হ'ল কিছু অ্যারে, সম্ভবত অ্যারের অ্যারে। । ।

var উত্তর = _.ড্রেস (এন, ফাংশন (ক, খ) {a.concat (খ) b)


1

কনক্যাট করার জন্য যদি কেবল দুটি অ্যারে থাকে এবং আপনার আসলে সংযোজন করা দরকার নতুন কোনও তৈরির পরিবর্তে অ্যারে , ধাক্কা বা লুপটি যাওয়ার উপায়।

বেঞ্চমার্ক: https://jsperf.com/concat-small-arrays-vs-push-vs-loop/


0

এটা চেষ্টা কর:

i=new Array("aaaa", "bbbb");
j=new Array("cccc", "dddd");

i=i.concat(j);

@ গ্রেগি, আপনি উভয়ই একই উত্স থেকে অনুলিপি-পেস্ট করেছেন;)
I.devries

না, আমি আপনাকে একই লিঙ্কটিতে তথ্য পরীক্ষা করেছি। ilovethecode.com/ জাভাস্ক্রিপ্ট
জাভাস্ক্রিপ্ট-

হ্যাঁ ... আমি অনুমান করি আমরা এটি একই উত্স থেকে পেয়েছি: ডি
রেজি

কমপক্ষে @ জাইরো অ্যারের সামগ্রী পরিবর্তন করেছে। পছন্দ করেছেন :)
ডগবনে

এটি একই, গুরুত্বপূর্ণ বিষয়টি মানুষকে এর সমস্যাগুলি সমাধান করতে সহায়তা করে :)
জাইরো

0

যদি এন অ্যারেগুলি ডাটাবেস থেকে প্রাপ্ত হয় এবং হার্ডকোড না হয় তবে আমি এটি ES6 ব্যবহার করে এটি করব

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