অ্যারে একাধিক উপাদান ধাক্কা


284

আমি একাধিক উপাদানকে একটি অ্যারে হিসাবে ঠেলে দেওয়ার চেষ্টা করছি তবে ত্রুটি হচ্ছে

> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined

আমি রুবিতে যে একই জিনিস করব তা করার চেষ্টা করছি, আমি ভাবছিলাম এটি applyএমন কিছু *

>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]

উত্তর:


240

applyবা এর সাথে অবজেক্টের বেশিরভাগ ফাংশন ব্যবহার করার সময় call, contextপ্যারামিটারটি আপনি কাজ করছেন এমন জিনিস হতে হবে।

এই ক্ষেত্রে, আপনার প্রয়োজন a.push.apply(a, [1,2])(বা আরও সঠিকভাবে Array.prototype.push.apply(a, [1,2]))


617

আপনি নিম্নলিখিত পদ্ধতিতে একাধিক উপাদানকে একটি অ্যারেতে ঠেলাতে পারেন

var a = [];
    
a.push(1, 2, 3);

console.log(a);


1
এই উত্তর এবং নির্বাচিত উত্তর আলাদা এবং সম্ভবত অপ্রত্যাশিত ফলাফল দেয় produce a.push (1) বনাম a.push ([1])
ওভেনা

1
যে কেউ ব্যাখ্যা করতে পারেন, কেন গৃহীত উত্তরের চেয়ে এত বেশি ভোট রয়েছে? এটি সহজ হতে পারে, তবে কম নমনীয়। আপনি যদি 2 টি অ্যারে মার্জ করতে চান তবে এটি কাজ করবে না।
ব্লু

@ ব্লু আপনি যদি দুটি অ্যারে মার্জ করতে চান তবে কেবল অ্যারে কোডক্যাট () ব্যবহার করুন
ফ্লোরেন্ট

@ ফ্লোরেন্টআরল্যান্ডিস অ্যারে.কনক্যাট প্রথমটিতে ২ য় অ্যারে যুক্ত করার জন্য কাজ করে না। এটি একটি নতুন তৈরি করবে। আমি জানি এটি একই রকম। স্প্রেড অপারেটর আমি যা খুঁজছিলাম। বিশদটির জন্য কেবল সেখানে অন্যান্য উত্তর এবং মন্তব্যগুলি দেখুন।
ব্লু

435

এখন ECMAScript2015 (ওরফে ES6) এ, আপনি একবারে একাধিক আইটেম সংযোজন করতে স্প্রেড অপারেটরটি ব্যবহার করতে পারেন :

var arr = [1];
var newItems = [2, 3];
arr.push(...newItems);
console.log(arr);

দেখুন Kangax এর ES6 সামঞ্জস্য টেবিল কি ব্রাউজার সামঞ্জস্যপূর্ণ দেখতে


41
whaaaaaaat এটা দুর্দান্ত, প্লাস, আপনি যদি টাইপ করা বিষয় এটা কি এটা push.apply তাই কম্পাইল করবে অনুন্নত সহাবস্থানযোগ্যতা আছে
ক্রিস

72

আপনি ব্যবহার করতে পারেন Array.concat:

var result = a.concat(b);

16
অ্যারে.প্রোটোটাইপ.কম্যাট নতুন অ্যারে প্রদান করে।
সারিক্যাকটাস

12
তিনি বিদ্যমান অ্যারেতে ধাক্কা দিতে চান তাই Array.prototype.push.apply(arr1, arr2)সঠিক উত্তর, কারণ arr1.concat(arr2)আপনি ব্যবহার করে একটি নতুন অ্যারে তৈরি করা হচ্ছে।
সারিক্যাকটাস

3
@ সুরিক্যাকটাস arr1 = arr1.concat(arr2)কোনও বড় বিষয় নয় এবং এটি আরও পরিচ্ছন্ন দেখাচ্ছে looks পুরানো অ্যারেতে পুশ করা বা পুরানো অ্যারের পরিবর্তে নতুনটি আপনার প্রয়োজনের উপর নির্ভর করে। যদি আপনি 10 মি + উপাদানগুলি পুরানো অ্যারেতে ঠেলাঠেলি করে নিয়ে কাজ করেন তবে দ্রুত কাজ করবে, আপনি যদি ছোট ছোট খণ্ডগুলি পরিচালনা করেন তবে আপনি গতিতে খুব কমই কোনও পার্থক্য খুঁজে পাবেন। উভয় বিকল্প একটি সম্পূর্ণ আইনী।
ভিজিওন

5
@YuvalA। prototype.push.applyশুধুমাত্র pushএকবার কল । এবং উপরের পার্থক্যটি গতি সম্পর্কে প্রয়োজনীয় নয় তবে একটি নতুন অ্যারে তৈরির মধ্যে একটি ইন-প্লেস অপারেশন। আমার যদি এমন কোনও পদ্ধতি থাকে যা একটি অ্যারে নিয়েছিল এবং এটি জায়গায় স্থানান্তরিত করার কথা ছিল? concatপদ্ধতি সম্ভবত কাজ না পারেন, এমনকি VisionN এর কোড দিয়ে ফাংশনের আহ্বানকারী জন্য পরিবর্তনশীল সংশোধন করা হবে না হিসাবে।
কোডারফরফিলিপ 2'16

1
a = a.concat(b)এখনও তুলনায় একটি সংক্ষিপ্ত বাক্য গঠনArray.prototype.push.apply(arr1, arr2)
এজাত সুহরদী

22

আপনি যদি Array.concatECMAScript 2015 (ওরফে ES6, ES2015) এর বিকল্প চান তবে এটি এর মতো অ্যারে পরিবর্তন করে না তবে একটি নতুন অ্যারে প্রদান করে আপনি স্প্রেড অপারেটরটি এভাবে ব্যবহার করতে পারেন :

var arr = [1];
var newItems = [2, 3];
var newerItems = [4, 5];
var newArr = [...arr, ...newItems, ...newerItems];
console.log(newArr);

নোটটি pushপদ্ধতির চেয়ে আলাদা যা pushনীতিটি পরিবর্তিত হয় / অ্যারে পরিবর্তন করে /

আপনি যদি দেখতে চান যে কিছু ES2015 বৈশিষ্ট্যগুলি আপনার ব্রাউজারে কাজ করে কিনা তা কঙ্গাক্সের সামঞ্জস্য টেবিলটি পরীক্ষা করে ।

আপনি যদি ব্রাউজার সমর্থনের জন্য অপেক্ষা করতে না চান এবং প্রযোজনায় ES2015 ব্যবহার করতে চান না তবে আপনি বাবেল বা অনুরূপ ট্রান্স্পেলারও ব্যবহার করতে পারেন।


4

অনেক উত্তর ব্যবহারের সুপারিশ আছেন: Array.prototype.push(a, b)। এটা দুর্দান্ত উপায়, কিন্তু যদি সত্যিই বিগ বি থাকবে, আপনি স্ট্যাক ওভারফ্লো ত্রুটি (কারণ অনেক args এর) থাকবে। এখানে সাবধান।

দেখুন এন অ্যারে সংঘবদ্ধ করার সবচেয়ে কার্যকরী উপায় কী? আরো বিস্তারিত জানার জন্য.


3
এটি প্রশ্নের উত্তর দেয় না। কোনও লেখকের কাছ থেকে সমালোচনা বা স্পষ্টতার জন্য অনুরোধ জানাতে, তাদের পোস্টের নীচে একটি মন্তব্য দিন। [আমি কীভাবে ভাল উত্তর লিখব? ] ( Stackoverflow.com/help/how-to-answer )
mrun

1
দুঃখিত, যথেষ্ট খ্যাতি না থাকার কারণে আমি উত্তরগুলির অধীনে (আমার নিজস্ব ব্যতীত) মন্তব্য করতে পারি না :)। তবে মনে হয় সম্পূর্ণ ওভারভিউ করার জন্য এটি এখানে উল্লেখ করা উচিত। আপনি আমার জন্য এটি করতে পারেন? তারপরে আমি আমার উত্তরটি সরিয়ে ফেলব।
12 কেবি

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