পুনরায় সাজানো অ্যারে


99

বলুন, আমার কাছে এমন অ্যারে রয়েছে যা দেখতে দেখতে এটির মতো:

var playlist = [
    {artist:"Herbie Hancock", title:"Thrust"},
    {artist:"Lalo Schifrin", title:"Shifting Gears"},
    {artist:"Faze-O", title:"Riding High"}
];

আমি কীভাবে একটি উপাদানকে অন্য অবস্থানে নিয়ে যেতে পারি?

আমি উদাহরণস্বরূপ, {artist:"Lalo Schifrin", title:"Shifting Gears"}শেষ পর্যন্ত যেতে চাই want

আমি এর মতো স্প্লাইস ব্যবহার করার চেষ্টা করেছি:

var tmp = playlist.splice(2,1);
playlist.splice(2,0,tmp);

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


4
"কাজ করে না" এর অর্থ কী - এটি কোনও ত্রুটি ছুঁড়ে ফেলে, এটি কি কিছুই পরিবর্তন করে না, এটি কীভাবে আপনার ইচ্ছা না এমনভাবে আপনার অ্যারে পরিবর্তন করে? এটা আমার কাছে যুক্তিসঙ্গত মনে হচ্ছে।
জ্যাকব ম্যাটিসন

উত্তর:


226

এর বাক্য গঠনটি Array.spliceহ'ল:

yourArray.splice(index, howmany, element1, /*.....,*/ elementX);

কোথায়:

  • সূচি হ'ল অ্যারেতে অবস্থান যা আপনি উপাদান থেকে অপসারণ শুরু করতে চান
  • আপনি কতগুলি উপাদান সূচি থেকে সরাতে চান তা কতটা হ'ল
  • element1, ..., elementX উপাদান আপনি অবস্থান থেকে ঢোকানো চান হয় সূচক

এর অর্থ হল splice()আপনার পাস হওয়া আর্গুমেন্টগুলির উপর নির্ভর করে উপাদানগুলি সরানো, উপাদান যুক্ত করতে বা অ্যারেতে উপাদানগুলি প্রতিস্থাপন করতে ব্যবহার করা যেতে পারে।

নোট করুন এটি মুছে ফেলা উপাদানগুলির একটি অ্যারে প্রদান করে।

সুন্দর এবং জেনেরিক কিছু হবে:

Array.prototype.move = function (from, to) {
  this.splice(to, 0, this.splice(from, 1)[0]);
};

তারপরে কেবল ব্যবহার করুন:

var ar = [1,2,3,4,5];
ar.move(0,3);
alert(ar) // 2,3,4,1,5

চিত্র:

অ্যালগরিদম ডায়াগ্রাম


17
এটি একটি ভাল উত্তর এবং স্প্লাইস () একটি স্প্লাইসের মধ্যে () কাজটি ভাল করে তোলে। তবে এটি লক্ষ করা উচিত যে অ্যারে প্রোটোটাইপটিতে একটি মুভ () পদ্ধতি যুক্ত করার নামটিকে "মনকি প্যাচিং" বলা হয় এবং এটি সাধারণত খারাপ অভ্যাস হিসাবে বিবেচিত হয়। stackoverflow.com/questions/5741877/…
অ্যারন Cici

22

আপনি যদি সূচকগুলি জানেন তবে আপনি সহজেই এই জাতীয় ফাংশন সহ উপাদানগুলি অদলবদল করতে পারবেন:

function swapElement(array, indexA, indexB) {
  var tmp = array[indexA];
  array[indexA] = array[indexB];
  array[indexB] = tmp;
}

swapElement(playlist, 1, 2);
// [{"artist":"Herbie Hancock","title":"Thrust"},
//  {"artist":"Faze-O","title":"Riding High"},
//  {"artist":"Lalo Schifrin","title":"Shifting Gears"}]

অ্যারে সূচকগুলি অ্যারে অবজেক্টের কেবল বৈশিষ্ট্য, তাই আপনি এর মানগুলি অদলবদল করতে পারেন।


ধন্যবাদ, @ সিএমএস আমি যদি অদলবদল করতে চাই না তবে অর্ডারটি প্রতিস্থাপন করতে চাই না ... উদাহরণস্বরূপ, আমি যদি তৃতীয় অবজেক্টটি 1 ম পজিশনে নির্বাচন করি তবে আমি 1 কে 2 হিসাবে 2 এবং 2 হিসাবে 3 হিসাবে 1 হিসাবে পরিবর্তন করতে চাই
পেরি

14

যারা আগ্রহী তাদের জন্য এখানে একটি অপরিবর্তনীয় সংস্করণ:

function immutableMove(arr, from, to) {
  return arr.reduce((prev, current, idx, self) => {
    if (from === to) {
      prev.push(current);
    }
    if (idx === from) {
      return prev;
    }
    if (from < to) {
      prev.push(current);
    }
    if (idx === to) {
      prev.push(self[from]);
    }
    if (from > to) {
      prev.push(current);
    }
    return prev;
  }, []);
}

হাই, আপনি কি আমাকে উপরের উত্তরটির সাথে এই ফাংশনটির সুবিধাগুলি ব্যাখ্যা করতে পারেন?
Xogno

4
এই সমাধানটি মূল উপাদানটি সংশোধন করে না তবে এন্ট্রি স্থানান্তরিত হওয়ার সাথে সাথে একটি নতুন অ্যারে প্রদান করে।
চামনি

7

উপাদানটি সরানোর সময় স্প্লাইস কলের প্রথম পরামিতি হিসাবে 2 থেকে 1 পরিবর্তন করুন:

var tmp = playlist.splice(1, 1);
playlist.splice(2, 0, tmp[0]);

4
এটি প্লেলিস্ট.স্প্লাইস হওয়া উচিত (২,০, টিএমপি [0]); ঠিক?
ক্রিসবুট

7

সঙ্গে ES6 আপনি ভালো কিছু করতে পারেন:

const swapPositions = (array, a ,b) => {
  [array[a], array[b]] = [array[b], array[a]]
}

let array = [1,2,3,4,5];
swapPositions(array,0,1);

/// => [2, 1, 3, 4, 5]

4
এটি দুটি উপাদানের অবস্থানের অদলবদল করে। পুনঃক্রমের জন্য প্রশ্ন।
বাই

6

আপনি সর্বদা বাছাই পদ্ধতিটি ব্যবহার করতে পারেন, আপনি যদি না জানেন তবে রেকর্ডটি বর্তমানে রয়েছে:

playlist.sort(function (a, b) {
    return a.artist == "Lalo Schifrin" 
               ? 1    // Move it down the list
               : 0;   // Keep it the same
});

4
কী সম্পর্কেreturn +(a.artist == "Lalo Schifrin")
ফানকোডাব্যাট

4
আপনি যদি ভার্বোসিটির চেয়ে ব্রেভিটি পছন্দ করেন তবে ফুনকো আপনি এটি করতে পারেন।
অ্যান্ডি ই

2

সম্পাদনা: অ্যান্ডির উত্তরটি প্রথম আসার সাথে সাথে তার উত্তরটি পরীক্ষা করে দেখুন এবং এটি কেবল তারই বর্ধন

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি মনে করি এটি অন্তর্ভুক্ত করা ভাল Array.prototype.sort()

লিঙ্কের সাথে এমডিএন এর উদাহরণ এখানে

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);

// [1, 2, 3, 4, 5]

ভাগ্যক্রমে এটি কেবল সংখ্যা নিয়ে কাজ করে না:

arr.sort([compareFunction])

compareFunction

সারণি ক্রম সংজ্ঞায়িত করে এমন একটি ফাংশন নির্দিষ্ট করে। বাদ দেওয়া থাকলে অ্যারের প্রতিটি অক্ষরের স্ট্রিং রূপান্তর অনুসারে প্রতিটি অক্ষরের ইউনিকোড কোড পয়েন্ট মান অনুসারে বাছাই করা হয়।

আমি লক্ষ্য করেছি যে আপনি তাদের প্রথম নাম দিয়ে অর্ডার করছেন:

let playlist = [
    {artist:"Herbie Hancock", title:"Thrust"},
    {artist:"Lalo Schifrin", title:"Shifting Gears"},
    {artist:"Faze-O", title:"Riding High"}
];

// sort by name
playlist.sort((a, b) => {
  if(a.artist < b.artist) { return -1; }
  if(a.artist > b.artist) { return  1; }

  // else names must be equal
  return 0;
});

মনে রাখবেন যে আপনি যদি তাদের শেষ নাম দিয়ে অর্ডার করতে চান তবে আপনার উভয়ের জন্য একটি কী থাকতে হবে first_nameএবং last_nameঅথবা কিছু এক্সটেনশন ম্যাজিক করতে হবে, যা আমি এক্সডি করতে পারি না

আশা করি এইটি কাজ করবে :)


এটি এই উত্তরের একটি সম্পাদনা বা মন্তব্য হওয়া উচিত ।
জ্যারেড স্মিথ

@ জারেডস্মিথ উফ! আমি তার উত্তর দেখতে পেলাম না। তাঁর প্রশ্নটি সম্পাদনা করার মতো পর্যাপ্ত পয়েন্ট বা যা কিছুই আমার নেই, এবং আমি মনে করি না যে এই সমস্ত তথ্য একটি মন্তব্যে যুক্ত করা উচিত। সুতরাং কেউ তার প্রশ্ন সম্পাদনা না করা পর্যন্ত আমি কেবল যুক্ত করব যে এটি অ্যান্ডি ই এর উত্তরের (এটি আমার হওয়া উচিত) মত একটি এক্সটেনশন।
জ্যাকো তোরাস

আমি মনে করি এটি এখন ঠিক আছে :)
জারেড স্মিথ


1

আপনি যদি কেবল কোনও আইটেমকে স্বেচ্ছাসেবীর অবস্থান থেকে অ্যারের শেষের দিকে যেতে চান তবে এটি কাজ করা উচিত:

function toEnd(list, position) {
    list.push(list.splice(position, 1));
    return list;
}

আপনি যদি কিছু স্বেচ্ছাসেবক অবস্থান থেকে শেষের দিকে একাধিক আইটেম সরিয়ে নিতে চান তবে আপনি এটি করতে পারেন:

function toEnd(list, from, count) {
    list.push.apply(list, list.splice(from, count));
    return list;
}

আপনি যদি একাধিক আইটেম কিছু স্বেচ্ছাসেবক অবস্থান থেকে কিছু স্বেচ্ছাসেবী অবস্থানে যেতে চান, চেষ্টা করুন:

function move(list, from, count, to) {
    var args = [from > to ? to : to - count, 0];
    args.push.apply(args, list.splice(from, count));
    list.splice.apply(list, args);

    return list;
}

0

একটি সাধারণ পরিবর্তনীয় সমাধান হিসাবে আপনি পরপর দু'বার স্প্লাইস কল করতে পারেন:

playlist.splice(playlist.length - 1, 1, ...playlist.splice(INDEX_TO_MOVE, 1))

অন্যদিকে, একটি সাধারণ অবিচ্ছেদ্য সমাধান স্লাইস ব্যবহার করতে পারে কারণ এই পদ্ধতিটি পরিবর্তন না করে মূল অ্যারে থেকে কোনও বিভাগের অনুলিপি প্রদান করে:

const copy = [...playlist.slice(0, INDEX_TO_MOVE - 1), ...playlist.slice(INDEX_TO_MOVE), ...playlist.slice(INDEX_TO_MOVE - 1, INDEX_TO_MOVE)]

-2

এর কাজটি এভাবে পুনরায় অর্ডার করুন

 var tmpOrder = playlist[oldIndex];
    playlist.splice(oldIndex, 1);
    playlist.splice(newIndex, 0, tmpOrder);

আমি আশা করি এটি কার্যকর হবে


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