আসল অ্যারেটি পরিবর্তন না করে জাভাস্ক্রিপ্টে অ্যারের বিপরীত করুন


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
আমি এই পদ্ধতির ব্যবহার করার পরামর্শ দেব না, কারণ এটি অত্যন্ত বিভ্রান্তিকর অনুশীলন। আপনি স্লাইস () ব্যবহার করার সময় এটি খুব বিভ্রান্তিকর হয় এবং আপনি আসলে কিছুই কাটেন না। যদি আপনার অপরিবর্তনীয় বিপরীতে প্রয়োজন হয় তবে কেবল নতুন নতুন অনুলিপি তৈরি করুন: কনট নিউ অ্যারে = [... অ্যারে]। রিভার্স ()
ওলেগ

104

ES6 এ:

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

2
এর পারফরম্যান্স কীভাবে গৃহীত উত্তরের সাথে তুলনা করে? তারা কি একই?
কেটি

@ কেটি খুব সহজ, উভয়ই খুব দ্রুত, ক্রোম [...].reverseখুব সাধারণ পরীক্ষার ক্ষেত্রে একটি প্রান্ত দেয় বলে মনে হচ্ছে । jsperf.com/reverse-vs-slice-reverse/1
ব্রায়ান এম হান্ট

4
আমি ধারাবাহিকভাবে .sliceউল্লেখযোগ্যভাবে দ্রুততর হয়ে উঠছি ।
জেমস কোয়েল

3
@ জেমসকোয়েল এটি সম্ভবত ব্রাউজার এবং ওএস নির্ভর, তবে sliceএটি সম্ভবত দ্রুত / বি / সি [...]জেনেরিক পুনরাবৃত্ত-টু-অ্যারে তাই অনেকগুলি অনুমান করা যায় না। পাশাপাশি, এটি সম্ভবত sliceদীর্ঘ সময় ধরে চলেছে এমনটি আরও ভালরূপে অনুকূলিত হয়েছে /
ব্রায়ান এম হান্ট

আমার চিন্তা ঠিক.
জেমস কোয়েল

11

আর একটি ES 6 বৈকল্পিক:

আমরা .reduceRight()আসলে এটির বিপরীত না করে বিপরীত অ্যারে তৈরি করতেও ব্যবহার করতে পারি।

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

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

console.log(B);

দরকারী সংস্থানসমূহ:


2
reduceRightধীরে ধীরে
ড্র্যাগস রাইসেস্কু

@ ড্রাগোসরেসেসকু আপনি কি কিছু নমুনা পরীক্ষার ফলাফল ভাগ করতে পারেন?
মোহাম্মদ উসমান

1
এখানে একটি রেপো যা আপনি খেলতে পারেন: (সেরা উদাহরণ নয়, তবে কিছুক্ষণ আগে কারও সাথে প্রতিক্রিয়া প্রসঙ্গে এই যুক্তিটি ছিল, সুতরাং আমি এটি একসাথে রেখেছি
ড্রাগগস রাইসেস্কু

4
(a, c) => a.concat([c])এর চেয়ে বেশি মূর্খতা বোধ করে(a, c) => (a.push(c), a)
কাইল লিন

1
@ ড্রাগোস রাইসেস্কু আসলে এটি দেখতে 3 টি শীর্ষ উত্তরের মধ্যে দ্রুত like jsperf.com/reverse-vs-slice-reverse/3
ডিবসলে

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]), []);

মূলত এটি যা করে তা হ'ল foo এ পরবর্তী উপাদান সহ একটি নতুন অ্যারে তৈরি করা এবং খ এর পরে প্রতিটি পুনরাবৃত্তির জন্য সঞ্চিত অ্যারে ছড়িয়ে দেওয়া।

[]
[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) @ ক্লিন্টহারিস দেখায় এটি অ্যারেটিকে পরিবর্তিত করে, সুতরাং এটি .revers () এর চেয়ে ভাল আর কিছু নয়। (২) আপনার তুলনাকারী অবৈধ - আপনি যখন a, b এর জন্য 1 ফেরান, আপনাকে অবশ্যই খ, ক এর জন্য একটি নেতিবাচক সংখ্যা ফেরত দিতে হবে। যদি আপনার উত্তর কিছু বাস্তবায়নে অ্যারেটিকে উল্টে দেয় তবে এটি সম্পূর্ণ ভাগ্য দ্বারা।
ডন হ্যাচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.