मूल सरणी को बदलने के बिना जावास्क्रिप्ट में रिवर्स सरणी


188

Array.prototype.reverse किसी सरणी की सामग्री को जगह में (म्यूटेशन के साथ) उलट देता है ...

क्या मूल सरणी की सामग्री (म्यूटेशन के बिना) को बदले बिना किसी सरणी को उलटने के लिए एक समान सरल रणनीति है?



यहाँ विभिन्न विकल्पों की तुलना करने वाला एक बेंचमार्क है: jsben.ch/HZ7Zp
सोलोमन उको

जवाबों:


373

आप प्रतिलिपि बनाने के लिए स्लाइस () का उपयोग कर सकते हैं, फिर इसे उल्टा () कर सकते हैं

var newarray = array.slice().reverse();


क्या आप कोई मापदंडों के साथ टुकड़ा () विस्फोट कर सकते हैं?
एलेक्स

3
@ एलेक्स स्लाइस - If begin is omitted, slice begins from index 0.- तो यह वैसा ही हैarray.slice(0)
अरुण पी जॉनी

2
मुझे लगता है कि @ एलेक्स का मतलब 'अपने उत्तर में इसे समझाना' है ... चाहे ... शानदार समाधान। धन्यवाद!
sfletche

12
मैं इस दृष्टिकोण का उपयोग करने की अनुशंसा नहीं करूंगा, क्योंकि यह बहुत ही भ्रामक अभ्यास है। यह बहुत भ्रामक है जब आप स्लाइस () का उपयोग करते हैं और आप वास्तव में कुछ भी नहीं काटते हैं। यदि आपको अपरिवर्तनीय रिवर्स चाहिए, तो बस नई नई कॉपी बनाएं: const newArray = [... array] .reverse ()
ओलेग मेटी

104

ES6 में:

const newArray = [...array].reverse()

2
इस के प्रदर्शन की तुलना स्वीकृत उत्तर से कैसे होती है? क्या यह वही है?
केटी

@ केटी बहुत समान है, दोनों बहुत तेज, क्रोम के साथ [...].reverseएक बहुत ही सरल परीक्षण मामले में बढ़त देने के लिए लग रहा है । jsperf.com/reverse-vs-slice-reverse/1
ब्रायन एम। हंट

4
मैं लगातार .sliceकाफी तेज हो रहा हूं ।
जेम्स कोयल

3
@JamesCoyle यह शायद ब्राउज़र और ओएस पर निर्भर है, लेकिन sliceतेजी से होने की संभावना है b / c [...]एक सामान्य चलने-फिरने वाली सरणी है, इसलिए कई धारणाएं नहीं बन सकती हैं। साथ ही, यह संभावना है कि sliceयह बेहतर अनुकूलित बी / सी है जो लंबे समय से है।
ब्रायन एम। हंट

मेरे विचार से भी।
जेम्स कॉयल

11

एक और ES6 प्रकार:

हम .reduceRight()वास्तव में इसे उलटए बिना उलट सरणी बनाने के लिए भी उपयोग कर सकते हैं ।

let A = ['a', 'b', 'c', 'd', 'e', 'f'];

let B = A.reduceRight((a, c) => (a.push(c), a), []);

console.log(B);

उपयोगी संसाधन:


2
reduceRightधीमी गति से होता है
ड्रैगोस राइजस्कु

@DragosRizescu क्या आप कुछ नमूना परीक्षण परिणाम साझा कर सकते हैं?
मोहम्मद उस्मान

1
यहां एक रेपो है जिसे आप साथ निभा सकते हैं: (सबसे अच्छा उदाहरण नहीं, लेकिन किसी प्रतिक्रिया के संदर्भ में कुछ समय पहले किसी के साथ यह तर्क था, इस प्रकार मैंने इसे एक साथ रखा है): github.com/rizedr/reduce-vs-reduceRight
ड्रैगोस राइजस्कू

4
(a, c) => a.concat([c])से अधिक मुहावरेदार लगता है(a, c) => (a.push(c), a)
काइल लिन

1
@DragosRizescu वास्तव में ऐसा लगता है कि यह 3 शीर्ष उत्तर का सबसे तेज़ है। jsperf.com/reverse-vs-slice-reverse/3
DBosley

7

इस पुनरावर्ती समाधान का प्रयास करें:

const reverse = ([head, ...tail]) => 
    tail.length === 0
        ? [head]                       // Base case -- cannot reverse a single element.
        : [...reverse(tail), head]     // Recursive case

reverse([1]);               // [1]
reverse([1,2,3]);           // [3,2,1]
reverse('hello').join('');  // 'olleh' -- Strings too!                              

1
ऐसा लगता है कि यह खाली सरणियों के लिए टूट जाएगा।
मथियास

6

एक ES6 विकल्प का उपयोग करना .reduce()और फैलाना।

const foo = [1, 2, 3, 4];
const bar = foo.reduce((acc, b) => ([b, ...acc]), []);

मूल रूप से यह जो करता है वह फू में अगले तत्व के साथ एक नया सरणी बनाता है, और बी के बाद प्रत्येक पुनरावृत्ति के लिए संचित सरणी को फैलाता है।

[]
[1] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]

वैकल्पिक .reduceRight()रूप से जैसा कि ऊपर उल्लेख किया गया है, लेकिन .push()म्यूटेशन के बिना ।

const baz = foo.reduceRight((acc, b) => ([...acc, b]), []);

4

किसी सरणी को संशोधित किए बिना उलटने के कई तरीके हैं। उनमें से दो हैं

var array = [1,2,3,4,5,6,7,8,9,10];

// Using Splice
var reverseArray1 = array.splice().reverse(); // Fastest

// Using spread operator
var reverseArray2 = [...array].reverse();

// Using for loop 
var reverseArray3 = []; 
for(var i = array.length-1; i>=0; i--) {
  reverseArray.push(array[i]);
}

प्रदर्शन परीक्षण http://jsben.ch/guftu


0

इनटू प्लेन जावास्क्रिप्ट:

function reverseArray(arr, num) {
  var newArray = [];
  for (let i = num; i <= arr.length - 1; i++) {
    newArray.push(arr[i]);
  }

  return newArray;
}

0

केवल प्रदर्शनकारी उद्देश्यों के लिए परिवर्तनशील स्वैप के साथ जगह में उलटफेर (लेकिन अगर आपको म्यूट नहीं करना है तो आपको एक कॉपी की आवश्यकता है)

const myArr = ["a", "b", "c", "d"];
const copy = [...myArr];
for (let i = 0; i < (copy.length - 1) / 2; i++) {  
    const lastIndex = copy.length - 1 - i; 
    [copy[i], copy[lastIndex]] = [copy[lastIndex], copy[i]] 
}

-4

ES6:

const reverseArr = [1,2,3,4].sort(()=>1)

4
एसओ, रेडियन में आपका स्वागत है! उत्तर छोड़ते समय यह आमतौर पर यह समझाने के लिए एक अच्छा विचार है कि आपका उत्तर क्यों काम करता है और आप इस निष्कर्ष पर क्यों आए हैं, इससे नए उपयोगकर्ताओं को आपके द्वारा निर्दिष्ट इंटरैक्शन और भाषाओं को समझने में मदद मिलती है।
एथन फील्ड

रेडियन के बचाव में: पी कि 1अंत में शून्य से अधिक कुछ भी हो सकता है, क्योंकि Array.prototype.sortकॉलबैक (या तथाकथित compare function) काम करता है। मूल रूप से आप हमेशा 2 नंबरों की तुलना करते हैं और इस मामले में तुलनात्मक रिटर्न हमेशा सकारात्मक रहता है, इसलिए यह हमेशा कहता है कि पहले एक के सामने दूसरे नंबर पर जाएं :) यह बहुत ही व्याख्यात्मक है: stackoverflow.com/questions/6567941/…
iulial

8
sort()सरणी को उत्परिवर्तित करता है (जैसे, इसे जगह में क्रमबद्ध करता है), जिसे ओपी बचना चाहता है।
क्लिंट हैरिस

5
यह जवाब कई मायनों में गलत है। (1) यह सरणी को बदल देता है, जैसा कि @ClintHarris बताते हैं, इसलिए यह .reverse () से बेहतर नहीं है। (२) आपका तुलनित्र अवैध है - जब आप १, बी के लिए १ लौटते हैं, तो आपको बी के लिए एक ऋणात्मक संख्या लौटानी चाहिए। यदि आपका उत्तर कुछ कार्यान्वयन पर सरणी को उलट देता है, तो यह पूरी तरह से भाग्य से है।
डॉन हैच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.