2011-01-30 17 views
5

है वहाँ रास्ते में बनाया दूसरे में इतना की तरह एक सूची संलग्न करने के लिए एक:जावास्क्रिप्ट: एक पूरी सूची दबाएं?

var a = [1,2,3]; 
a.append([4,5]); 
// now a is [1,2,3,4,5]; 

concat() कुछ ऐसा ही है, लेकिन परिणाम देता है। मैं कुछ इस तरह push()

+0

[जावास्क्रिप्ट पुश सरणी मानों को किसी अन्य सरणी में संभावित डुप्लिकेट] (http://stackoverflow.com/questions/4156101/javascript-push-array-values-into-another-array), ["फ्लैट कैसे करें "जावास्क्रिप्ट में धक्का"] (http://stackoverflow.com/questions/4007744/how-to-do-a-flat-push-in-javascript) – outis

उत्तर

15

push काम करेंगे, लेकिन आप भी apply उपयोग करने के लिए की जरूरत है।

var a = [1,2,3]; 
a.push.apply(a, [4,5]) 
+1

मुझे लगता है कि 'Array.prototype.push.apply' होना चाहिए, मुझे लगता है। – lonesomeday

+0

@lonesomeday: आपको सही लगता है। 'a.push.apply' भी काम करेगा। मैं स्पष्ट रूप से अंतर विभाजित। – outis

+0

क्या आप * कैसे * यह काम करता है पर थोड़ा और विस्तार कर सकते हैं? – KooiInc

3

कैसे इस बारे में मौजूदा सूची को संशोधित करता हैं:

var a = [1, 2, 3]; 
a = a.concat([4, 5]); 
// a is now [1, 2, 3, 4, 5] 
+0

दूसरे को एक और अधिक कुशल होने के बाद उन्हें धक्का नहीं देगा? – shoosh

+0

@Shoosh, हाँ, शायद यह अधिक कुशल होगा। –

+0

concatenating से पहले निम्नलिखित कोड पर विचार करें: var b = a; परिवर्तनीय परिवर्तन, लेकिन बी अभी भी 1, 2, 3. है [उदाहरण] (http://jsfiddle.net/rg3sj/) – gor

4
var list = [1, 2]; 

लोगों को आप पहले से ही दिखाया है कि कैसे के साथ ऐसा करना:

  1. धक्का: list.push.apply(list, [3, 4]);
  2. concat: list = list.concat([4, 5]);

लेकिन मैं ES6 spread operator के बारे में बताना चाहता हूँ: list.push(...[3, 4]);

ध्यान रखें कि वर्तमान में कई ब्राउज़र इसका समर्थन नहीं करते हैं (आप ट्रांसलेटर का उपयोग कर सकते हैं)।

+0

मुझे पता चला कि, यदि आपकी सरणी बहुत बड़ी है और आप केवल 5-20 तत्व डालते हैं, तो 'list.push.apply' विधि बहुत तेज है। – Aloso

+0

@Aloso धन्यवाद, आप इसे एक संबंधित बेंचमार्क के साथ उत्तर के रूप में पोस्ट कर सकते हैं ("बेहद तेज़" और "बहुत बड़ा" –

+0

के पीछे की संख्या देखना अच्छा लगेगा, मुझे नहीं लगता कि यह एक संपूर्ण उत्तर के योग्य है। हालांकि , मैंने परीक्षण की गति के लिए एक jsperf बनाया: https://jsperf.com/array-vs-linkedlist-concat – Aloso

3

आप ES6 उपयोग कर रहे हैं आप प्रसार ऑपरेटर का उपयोग कर सकते

जैसे: -

listOne = [1,2,3] 
listTwo = [4,5,6] 
listTwo.push(...listOne) 
0

क्योंकि मैं तो बस एक वेब अनुप्रयोग जहां सरणियों का एक बहुत श्रेणीबद्ध किया जाना है और प्रदर्शन के लिए महत्वपूर्ण है, जहां लिखा था , मैंने परीक्षण किया कि कौन सी विधि सबसे तेज in this jsperf है। परिणाम काफी दिलचस्प हैं।

मेरे परीक्षण में, मैं 10,000 तत्वों की सूची या सरणी में 10 तत्व जोड़ता हूं।

यहां परीक्षण मामले हैं, सबसे तेज़ से धीमे तक।परिणाम क्रोम 62 में मापा जाता है, बल्कि Firefox 47 प्रदर्शन इसी तरह:

  • LinkedList.prototype.concat: 90,313,485 ऑप्स/सेकंड

    list.concat(concatList); 
    // This function has to change only 1-2 refences 
    
  • एक में पाश के लिए Array.prototype.push: 3,794,962 ऑप्स/सेकंड

    for (var i = 0, len = concatArr.length; i < len; i++) { 
        array.push(concatArr[i]); 
    } 
    // Probably fastest in real life 
    
  • Array.prototype.push.apply: 2,193,469 ऑप्स/सेकंड

    array.push.apply(array, concatArr); 
    
  • Array.prototype.concat: 22,701 ऑप्स/सेकंड

    array = array.concat(concatArr); 
    

दुर्भाग्य से, LinkedList संस्करण यदि आप कईLinkedList रों को एक सरणी/सूची concat करना चाहते हैं काम नहीं करता। प्रत्येक कॉन्सट ऑपरेशन से पहले LinkedList पर किसी सरणी को कॉपी करने की आवश्यकता होने पर इसका कोई फायदा नहीं होता है। तो, मेरे लिए, विजेता लूप के लिए विजेता है।

का एक कारण Array.prototype.push.apply का उपयोग नहीं करता है कि यह संक्रमित सरणी बहुत बड़ी है तो यह विफल हो जाती है। this answer के अनुसार, समेकित सरणी में फ़ायरफ़ॉक्स में 500,000 से अधिक तत्व और क्रोम में 150,000 तत्व नहीं हो सकते हैं।

मैंने spread operator को बाहर रखा क्योंकि यह सभी ब्राउज़रों द्वारा समर्थित नहीं है। क्रोम में, यह Array.prototype.push.apply जितना तेज़ है, फ़ायरफ़ॉक्स में यह थोड़ा धीमा है।

संबंधित मुद्दे