सरणी के लिए कई तत्वों को धक्का


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]))


618

आप निम्न तरीके से कई तत्वों को एक सरणी में धकेल सकते हैं

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

console.log(a);


1
यह उत्तर और चयनित उत्तर अलग-अलग और शायद अप्रत्याशित परिणाम देते हैं। a.push (1) बनाम a.push ([1])
oevna

1
क्या कोई समझा सकता है कि स्वीकृत उत्तर की तुलना में इतने अधिक वोट क्यों हैं? यह आसान हो सकता है, लेकिन कम लचीला है। यदि आप 2 सरणियों को मर्ज करना चाहते हैं, तो यह काम नहीं करेगा।
ब्लू

@BluE सम्मिलित किए जाने वाले दो सरणियों बस array.concat () का उपयोग करना चाहते हैं
फ्लोरेंट Arlandis

@FlorentArlandis array.concat पहले से दूसरे एरे को जोड़ने के लिए काम नहीं करता है। यह एक नया निर्माण करेगा। मुझे पता है कि यह समान है। प्रसार ऑपरेटर वह है जो मैं देख रहा था। विवरण के लिए बस अन्य उत्तरों और टिप्पणियों को देखें।
BluE

435

अब ECMAScript2015 (उर्फ ES6) में, आप एक साथ कई आइटम्स को जोड़ने के लिए प्रसार ऑपरेटर का उपयोग कर सकते हैं :

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

देखें Kangax के ES6 संगतता तालिका क्या ब्राउज़रों संगत को देखने के लिए


41
whaaaaaaat यह कमाल है, इसके अलावा, यदि आप इसे टाइपस्क्रिप्ट में करते हैं तो यह पुश करने के लिए संकलित करेगा। इसलिए आपको पिछड़ेपन की अनुकूलता है
क्रिस

72

आप उपयोग कर सकते हैं Array.concat:

var result = a.concat(b);

16
Array.prototype.concat नया सरणी देता है।
suricactus

12
वह मौजूदा एरे पर धकेलना चाहता है इसलिए Array.prototype.push.apply(arr1, arr2)सही उत्तर है, क्योंकि arr1.concat(arr2)आप एक नया एरे बना रहे हैं।
suricactus

3
@ सुरिकैक्टस arr1 = arr1.concat(arr2)कोई बड़ी बात नहीं है और बहुत साफ दिखता है। पुराने सरणी को धक्का देना या पुराने सरणी को नए के साथ बदलना आपकी आवश्यकताओं पर निर्भर करता है। यदि आप 10 मी + के साथ सौदा करते हैं तो पुराने सरणी को धक्का देने वाले तत्व तेजी से काम करेंगे, यदि आप छोटे चंक्स का प्रबंधन करते हैं तो आपको गति में कोई अंतर नहीं मिलेगा। दोनों विकल्प पूरी तरह से वैध हैं।
VisioN

5
@YuvalA। prototype.push.applyकेवल pushएक बार कॉल करता है । और ऊपर का अंतर गति के बारे में आवश्यक नहीं है, लेकिन इन-प्लेस ऑपरेशन बनाम एक नया सरणी बना रहा है। क्या होगा यदि मेरे पास एक विधि है जो एक सरणी लेती है और इसे जगह में संशोधित करना चाहिए था? concatविधि संभवतः काम नहीं कर सकता, यहां तक कि VisionN के कोड के साथ समारोह के फोन करने वाले के लिए चर को संशोधित नहीं होगा।
कोडरफ़ॉर्फ़लाइफ़

1
a = a.concat(b)अभी भी एक छोटे वाक्यविन्यास से अधिक हैArray.prototype.push.apply(arr1, arr2)
Aizzat Suhardi

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 सुविधाएँ काम करती हैं तो Kangax की संगतता तालिका देखें

यदि आप ब्राउज़र समर्थन की प्रतीक्षा नहीं करना चाहते हैं और उत्पादन में ES2015 का उपयोग करना चाहते हैं तो आप बैबल या एक समान ट्रांसपिलर का भी उपयोग कर सकते हैं ।


4

उपयोग करने के लिए कई उत्तर सुझाए गए हैं Array.prototype.push(a, b):। यह अच्छा तरीका है, लेकिन अगर आपको वास्तव में बड़ा बी होगा, तो आपको स्टैक ओवरफ्लो त्रुटि होगी (बहुत अधिक आर्ग की वजह से)। यहां सावधान रहें।

देखें एन सरणियों को घेरने का सबसे कुशल तरीका क्या है? अधिक जानकारी के लिए।


3
यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें। [मैं एक अच्छा जवाब कैसे लिखूं? ] ( stackoverflow.com/help/how-to-answer )
mrun

1
क्षमा करें, मैं पर्याप्त प्रतिष्ठा नहीं होने के कारण टिप्पणियों को अपने खुद के अलावा छोड़ सकता हूं :)। लेकिन ऐसा लगता है कि इसका उल्लेख यहां किया जाना चाहिए ताकि इसका पूरा अवलोकन हो सके। क्या आप इसे मेरे लिए कर सकते हैं? तब मैं अपना उत्तर हटा दूंगा।
12kb

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.