एन सरणियों को समाप्‍त करने का सबसे कारगर तरीका क्‍या है?


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)

हालांकि, ऐसा लगता है कि बड़े सरणियों (100,000 सदस्यों या अधिक के आदेश के लिए) के लिए, तत्वों की एक सरणी push(या तो apply()या ECMAScript 2015 प्रसार ऑपरेटर का उपयोग करके ) पास करने वाली तकनीक विफल हो सकती है। ऐसे सरणियों के लिए, लूप का उपयोग करना बेहतर दृष्टिकोण है। देखें https://stackoverflow.com/a/17368101/96100 जानकारी के लिए।


1
मेरा मानना ​​है कि आपके परीक्षण में त्रुटि हो सकती है: a.concat(b)परीक्षण के मामले में अनावश्यक रूप से सरणी की एक प्रति बनाकर aउसे फेंकने के लिए लगता है।
नन्हेंजेको

1
@ninjagecko: आप सही कह रहे हैं। मैं इसे अद्यतन: jsperf.com/concatperftest/6 । एक नई सरणी बनाने के विशेष मामले के लिए जो दो मौजूदा सरणियों को समेटता है, ऐसा प्रतीत होता है concat()कि आम तौर पर तेज है। जगह में मौजूदा सरणी पर एक सरणी को बदलने के मामले में, push()जाने का रास्ता है। मैंने अपना उत्तर अपडेट कर दिया।
टिम डाउन

16
मैं पुष्ट कर सकता हूं कि push.apply विधि का उपयोग करके कई नए सरणियों के साथ एक एकल सरणी का विस्तार करना सरल कॉनैट कॉल पर एक बहुत बड़ा प्रदर्शन लाभ (~ 100x) होता है। मैं v8 / नोड.js में पूर्णांकों की छोटी सूचियों की बहुत लंबी सूची के साथ काम कर रहा हूं।
चेरोएन

1
एक और भी संक्षिप्त तरीका a.push (... b) है;
दिनवाद

1
@ ordvlad: सच है, लेकिन केवल ES6 वातावरण में। मैंने अपने उत्तर में एक नोट जोड़ा है।
टिम डाउन

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

संपादित करें : दक्षता का प्रमाण: http://jsperf.com/multi-array-concat/7

EDIT2 : टिम Supinie टिप्पणी में कहा गया है कि इस दुभाषिया कॉल स्टैक आकार पार कर सकते हैं। यह शायद js इंजन पर निर्भर है, लेकिन मैंने कम से कम क्रोम पर "अधिकतम कॉल स्टैक आकार को पार कर लिया है"। टेस्ट मामला: [].concat.apply([], Array(300000).fill().map(_=>[1,2,3]))। (मैंने वर्तमान में स्वीकृत उत्तर का उपयोग करके एक ही त्रुटि प्राप्त की है, इसलिए कोई ऐसे उपयोग के मामलों की आशंका कर रहा है या दूसरों के लिए एक पुस्तकालय का निर्माण कर रहा है, विशेष परीक्षण आवश्यक हो सकता है कोई फर्क नहीं पड़ता कि आप कौन सा समाधान चुनते हैं।)


3
@ c69: यह कम से कम क्रोम पर बार-बार .push (#, #, ..., #) के चुने हुए उत्तर जितना ही कुशल लगता है। jsperf.com/multi-array-concat टिम डाउन द्वारा चुना गया उत्तर भी इसमें त्रुटि हो सकता है। यह लिंक कई सरणियों में शामिल होने के लिए एक प्रदर्शन तुलना है, जैसा कि सवाल पूछा गया (सिर्फ 2 नहीं); कई संभावित लंबाई का परीक्षण किया जाता है।
निंजाजेको

IMO, n सरणियों को "मर्ज" करने का सबसे प्रभावी तरीका है, अच्छी तरह से किया गया
एरिक उल्ल्ड

यह उत्तर विशेष रूप से तब उपयोगी होता है जब N को समय से पहले नहीं जाना जाता है जैसे कि जब आपके पास मनमानी लंबाई के सरणियों की एक सरणी होती है और आप उन सभी को संक्षिप्त रूप से चाहते हैं।
jfriend00

3
ES6 और प्रसार ऑपरेटरों के साथ यह और भी सरल हो जाता है: [] .concat (... [array1, array2, ...]) ठीक है, दूसरे तीन डॉट्स थोड़े दुर्भाग्यपूर्ण हैं। पहले तीन प्रसार ऑपरेटर डेवलपर हैं।
pmillailla.org/en/docs/Web/JavaScript/Reference/…

Eydrian: मैं व्यक्तिगत रूप से प्रसार ऑपरेटर से बचने की कोशिश करता हूं क्योंकि यह बहुत ही अक्षम है, लेकिन मुझे अभी तक यकीन नहीं है कि ऐसा इसलिए है क्योंकि कार्यान्वयन अपरिपक्व है, या es6 विनिर्देश के शब्दार्थ को भारी उठाने की आवश्यकता है (यानी यह कभी बेहतर नहीं होगा। )। हालांकि इस विशेष मामले में कोई बेंचमार्क नहीं चलाया गया है।
Ninjagecko

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]

यह कितना कारगर है? मैंने जिन चीज़ों का परीक्षण किया है, उनमें
hitautodestruct

28

concat()विधि दो या अधिक सरणियों शामिल होने के लिए प्रयोग किया जाता है। यह मौजूदा सरणियों को नहीं बदलता है, यह केवल सम्मिलित सरणियों की एक प्रति लौटाता है।

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

1
कभी-कभी मैं मूल सरणी को संशोधित नहीं करने के लिए जावास्क्रिप्ट से नफरत करता हूं। Ho
विंसेंट होच-

@ विन्सेन्टहॉच-द्रेई concatका उपयोग विशेष रूप से मूल सरणी को म्यूट किए बिना नए सरणियों को बनाने के लिए किया जाता है। आप अद्यतन करना चाहते हैं array1, तो आप का उपयोग करना होगाarray1.push(...array2, ...array3, ...array4)
अदिगा

24

Array.prototype.concat.apply का उपयोग करें कई सरणियों के संघनन को संभालने के लिए:

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[]? टाइपिंग वहाँ है - अजीब।
सिमोन_विवर

यह वास्तव में बड़े सरणी संस्करणों में बहुत ही अयोग्य है। jsperf.com/flatten-array-203948 [].concat.apply([], ...arr) बड़े वॉल्यूम पर बेहतर प्रदर्शन करता है।
9

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

आप perfomance की तुलना करने के लिए jsperf.com साइट का उपयोग कर सकते हैं । यहाँ के लिए लिंक है concat

के बीच तुलना जोड़ा गया:

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

यहां एक फ़ंक्शन है जिसके द्वारा आप कई संख्या में सरणियों को संक्षिप्त कर सकते हैं

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]

3

पुश के साथ मर्ज करें:

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


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

या प्रसार ऑपरेटर के बिना ES5 सिंटैक्स के साथ और भी बेहतर

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

यदि आप नहीं जानते हैं तो यह तरीका आसान है। कोड समय पर सरणियों का।


2

ES6 के साथ छोटा।

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

यह कई सरणियों को समाप्‍त और अद्वितीय करता है ;

कोडपेन पर डेमो


यह करता है, लेकिन यह डुप्लिकेट को हटा देता है .. क्या होगा अगर मैं डुप्लिकेट सरणियों को निकालना नहीं चाहता?
क्रुणाल शाह

new Set()डुप्लिकेट आइटम हटाता है। बस इसे हटा दें। [].concat(...Array)
रोनाल्ड्ट्गी

मैं नए सेट का उपयोग करना चाहता हूं ([]। कॉनकट (... ऐरे)); लेकिन मैं भी एक ही अभिव्यक्ति में इसके साथ डुप्लिकेट को दूर करना चाहते हैं। क्या यह संभव है ?
क्रुणाल शाह

1

जहाँ 'एन' कुछ संख्या में सरणियाँ हैं, शायद सारणियों की एक सरणी। । ।

var answer = _.reduce (n, function (a, b) {return 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);

@reggie, आप दोनों एक ही स्रोत से कॉपी-पेस्ट करते हैं;)
I.devries

नहीं, मैंने उसी लिंक में जानकारी की जाँच की है जो आप। ilovethecode.com/Javascript/Javascript-Tutorials-How_To-Easy/…
JAiro

हाँ ... मुझे लगता है कि हम इसे उसी स्रोत से प्राप्त करते हैं: D
reggie

कम से कम @JAiro ने ऐरे कंटेंट को बदल दिया। @reggie नहीं किया :)
डॉगबेन

यह वही है, महत्वपूर्ण बात यह है कि लोगों को इसकी समस्याओं को हल करने में मदद मिलती है :)
जेरो

0

यदि एन सरणियों को डेटाबेस से प्राप्त किया जाता है और हार्डकोड नहीं किया जाता है, तो मैं ईएस 6 का उपयोग करके इसे इस तरह से करूँगा

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