আসল অ্যারেটি পরিবর্তন না করে আপনি কীভাবে অ্যারে বাছাই করতে পারেন?


230

ধরা যাক আমি একটি বাছাই ফাংশন চেয়েছিলাম যা ইনপুটযুক্ত অ্যারের একটি সাজানো অনুলিপি দেয়। আমি নির্লজ্জভাবে এই চেষ্টা করেছি

function sort(arr) {
  return arr.sort();
}

এবং আমি এটি দিয়ে এটি পরীক্ষা করেছি, যা দেখায় যে আমার sortপদ্ধতিটি অ্যারেটিকে পরিবর্তন করছে।

var a = [2,3,7,5,3,7,1,3,4];
sort(a);
alert(a);  //alerts "1,2,3,3,3,4,5,7,7"

আমিও এই পদ্ধতির চেষ্টা করেছি

function sort(arr) {
  return Array.prototype.sort(arr);
}

কিন্তু এটি কিছুতেই কাজ করে না।

এর চারপাশে কি সরল কোনও উপায় আছে, পছন্দ মতো এমন কোনও উপায় যা আমার নিজের বাছাই করা অ্যালগরিদমকে হ্যান্ড-রোলিংয়ের প্রয়োজন হয় না বা অ্যারের প্রতিটি উপাদানকে নতুন করে অনুলিপি করার প্রয়োজন হয় না?


1
অ্যারের একটি গভীর অনুলিপি তৈরি করুন এবং পরিবর্তে এটি সাজান।
ইভানসিডডোনাল

1
@ ইভানমিডডোনাল একটি অগভীর অনুলিপি যথেষ্ট ভাল হতে পারে যদি সমস্ত চেয়ে থাকে তবে অ্যারের প্রতিটি আইটেমের নকল নয় ord
কেকোয়া

.sortthisঅ্যারে হিসাবে মান প্রয়োজন , সুতরাং শেষ স্নিপেটটি কাজ করার জন্য আপনি যা করতেন .sort.call(arr)(যদিও এটি আপনার সমস্যার সমাধান করে না)।
pimvdb

@ কেকোয়া হ্যাঁ এটি একটি ভাল বিষয়। আপনি কেবলমাত্র উপাদানগুলির ক্রম পরিবর্তন করতে চলেছেন এবং উপাদানগুলি নিজেরাই পরিবর্তন করতে চাইলে বেশি মেমোরি গ্রহণ করার দরকার নেই।
ইভানসিডডোনাল

zzzzBov এর পদ্ধতিটি কবজির মতো কাজ করছে! stackoverflow.com/a/9592774/7011860
সামেট এম।

উত্তর:


222

শুধু অ্যারে অনুলিপি করুন। এটি করার বিভিন্ন উপায় রয়েছে:

function sort(arr) {
  return arr.concat().sort();
}

// Or:
return Array.prototype.slice.call(arr).sort(); // For array-like objects

2
এটি কি একটি গভীর অনুলিপি করবে, অর্থাত্ নেস্টেড বস্তু এবং অ্যারেগুলিও অনুলিপি করা হবে?
পিটার ওলসন

2
concatওভার টু ব্যবহার করার কোনও সুবিধা আছে slice(0)বা এগুলি সবই ঠিক একই রকম?
জেয়ার্ডপাড়

3
@ পিটারলসন না, এটি অগভীর কপি। আপনি যদি সত্যিই একটি গভীর অনুলিপি চান, তবে স্ট্যাক ওভারফ্লোতে অনুসন্ধান বৈশিষ্ট্যটি ব্যবহার করে তার জন্য বিদ্যমান দুর্দান্ত উত্তরগুলি সন্ধান করুন।
রব ডব্লু

11
স্লাইস এখন উল্লেখযোগ্যভাবে দ্রুত হিসাবে রিপোর্ট করা হয়েছে
জেন্ডার ব্রাউন

3
এর Array.prototype.slice.call(arr).sort();পরিবর্তে কেন arr.slice().sort();?
অলিভিয়ার বোইস

152

এস 6 সহ অন্য একটি উপায় (অ-গভীর অনুলিপি):

const sorted = [...arr].sort();

অ্যারে আক্ষরিক হিসাবে স্প্রেড-সিনট্যাক্স (এমডিএন থেকে অনুলিপি করা):

var arr = [1, 2, 3];
var arr2 = [...arr]; // like arr.slice()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator


61

নিম্নলিখিত চেষ্টা করুন

function sortCopy(arr) { 
  return arr.slice(0).sort();
}

slice(0)অভিব্যক্তি উপাদান 0 এ অ্যারে শুরুর একটি কপি তৈরি করে।


32

অ্যারে অনুলিপি করতে আপনি কোনও যুক্তি ছাড়াই স্লাইস ব্যবহার করতে পারেন:

var foo,
    bar;
foo = [3,1,2];
bar = foo.slice().sort();

এই উত্তর দুর্দান্ত! আমি বিস্মিত জাভাস্ক্রিপ্ট এই ডিগ্রী পরিবর্তন করতে পারবেন। ভুল মনে হচ্ছে। আবার ধন্যবাদ.

12

আপনি এটি করতে পারেন

d = [20, 30, 10]
e = Array.from(d)
e.sort()

এইভাবে ডি পরিবর্তন করা হবে না।

function sorted(arr) {
  temp = Array.from(arr)
  return temp.sort()
}

//Use it like this
x = [20, 10, 100]
console.log(sorted(x))

এই উত্তরটি দুর্দান্ত
Leasye

1

যে কেউ গভীর অনুলিপি করতে চান (যেমন আপনার অ্যারেতে জিনিস রয়েছে) তারা ব্যবহার করতে পারেন:

let arrCopy = JSON.parse(JSON.stringify(arr))

তারপরে আপনি arrCopyপরিবর্তন না করে বাছাই করতে পারেন arr

arrCopy.sort((obj1, obj2) => obj1.id > obj2.id)

দয়া করে নোট করুন: এটি খুব বড় অ্যারেগুলির জন্য ধীর হতে পারে।


এটি আপনার দ্বিতীয় উদাহরণের -পরিবর্তে কাজ করবে >
pootzko

0

আমি আমার বেশিরভাগ অনুলিপিগুলির জন্য অবজেক্ট.সেসাইন () ব্যবহার করি:

var copyArray = Object.assign([], originalArray).sort();

যাইহোক, ওপি মন্তব্যগুলি দেখার পরে, আমি কিছুটা গভীর অনুলিপি নিয়ে গবেষণা করেছি এবং বের করেছিলাম অবজেক্ট.অ্যাসাইন কেবল একটি অগভীর অনুলিপিই সম্পাদন করে না, কেবলমাত্র অসংখ্য এবং নিজস্ব সম্পত্তিও নির্বাচন করে ( এই পোস্টে উত্তর হিসাবে )।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.