Array.prototype.reverse किसी सरणी की सामग्री को जगह में (म्यूटेशन के साथ) उलट देता है ...
क्या मूल सरणी की सामग्री (म्यूटेशन के बिना) को बदले बिना किसी सरणी को उलटने के लिए एक समान सरल रणनीति है?
Array.prototype.reverse किसी सरणी की सामग्री को जगह में (म्यूटेशन के साथ) उलट देता है ...
क्या मूल सरणी की सामग्री (म्यूटेशन के बिना) को बदले बिना किसी सरणी को उलटने के लिए एक समान सरल रणनीति है?
जवाबों:
आप प्रतिलिपि बनाने के लिए स्लाइस () का उपयोग कर सकते हैं, फिर इसे उल्टा () कर सकते हैं
var newarray = array.slice().reverse();
ES6 में:
const newArray = [...array].reverse()
[...].reverseएक बहुत ही सरल परीक्षण मामले में बढ़त देने के लिए लग रहा है । jsperf.com/reverse-vs-slice-reverse/1
.sliceकाफी तेज हो रहा हूं ।
sliceतेजी से होने की संभावना है b / c [...]एक सामान्य चलने-फिरने वाली सरणी है, इसलिए कई धारणाएं नहीं बन सकती हैं। साथ ही, यह संभावना है कि sliceयह बेहतर अनुकूलित बी / सी है जो लंबे समय से है।
एक और ES6 प्रकार:
हम .reduceRight()वास्तव में इसे उलटए बिना उलट सरणी बनाने के लिए भी उपयोग कर सकते हैं ।
let A = ['a', 'b', 'c', 'd', 'e', 'f'];
let B = A.reduceRight((a, c) => (a.push(c), a), []);
console.log(B);
उपयोगी संसाधन:
reduceRightधीमी गति से होता है
(a, c) => a.concat([c])से अधिक मुहावरेदार लगता है(a, c) => (a.push(c), a)
इस पुनरावर्ती समाधान का प्रयास करें:
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!
एक 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]), []);
किसी सरणी को संशोधित किए बिना उलटने के कई तरीके हैं। उनमें से दो हैं
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
इनटू प्लेन जावास्क्रिप्ट:
function reverseArray(arr, num) {
var newArray = [];
for (let i = num; i <= arr.length - 1; i++) {
newArray.push(arr[i]);
}
return newArray;
}
केवल प्रदर्शनकारी उद्देश्यों के लिए परिवर्तनशील स्वैप के साथ जगह में उलटफेर (लेकिन अगर आपको म्यूट नहीं करना है तो आपको एक कॉपी की आवश्यकता है)
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]]
}
ES6:
const reverseArr = [1,2,3,4].sort(()=>1)
1अंत में शून्य से अधिक कुछ भी हो सकता है, क्योंकि Array.prototype.sortकॉलबैक (या तथाकथित compare function) काम करता है। मूल रूप से आप हमेशा 2 नंबरों की तुलना करते हैं और इस मामले में तुलनात्मक रिटर्न हमेशा सकारात्मक रहता है, इसलिए यह हमेशा कहता है कि पहले एक के सामने दूसरे नंबर पर जाएं :) यह बहुत ही व्याख्यात्मक है: stackoverflow.com/questions/6567941/…
sort()सरणी को उत्परिवर्तित करता है (जैसे, इसे जगह में क्रमबद्ध करता है), जिसे ओपी बचना चाहता है।