اذهب إلى المحتوى
  • 0

ترتيب المصفوفة في جافاسكريبت

ابراهيم الخليل سماني

السؤال

ممكن احد يشرح لي السطر هذا :

[array[i], array[j]] = [array[j], array[i]];
let array = [1, 2, 3, 4, 5];


function shuffle(array) {
  for (let i = array.length - 1; i > 0; i--) {
    let j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

الشكل المبسط لشيفرة تبديل قيمة عنصرين في جافاسكربت بالشكل التالي:

let a = 1;
let b = 2;

[a, b] = [b, a];  // [a, b] = [2, 1]

// النتيجة
a; // => 2
b; // => 1

هي بسيطة فقط عليك تعويض القيم، بالنسبة لدليل المصفوفة i - j فهو ثابت لا تتغير قيمته

في الشيفرة لديك:

let array = [1, 2, 3, 4, 5];

[array[i], array[j]] = [array[j], array[i]];

لنستبدل أول قيمتين:

let array = [1, 2, 3, 4, 5];

let i = 0;
let j = 1;

[array[i], array[j]] = [array[j], array[i]];
=>
[array[0], array[1]] = [array[1], array[0]];
=> 
[array[0], array[1]] = [2, 1];
=>

array[0] => 2
array[1] => 1

وهكذا يتم تبديل القيمتين بين عنصرين في مصفوفة.

دليل العنصر ثابت إنما قيمة العنصر ذو الدليل X هي التي تتغير.

بالنسبة للشيفرة بشكل عام تقوم بخلط عناصر المصفوفة من خلال تبديل العنصر i مع عنصر آخر ذو دليل عشوائي j

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

يقوم هذا السطر بتبديل قيمة عنصرين معًا، فمثلًا إن كان لدينا المصفوفة التالية:

let array = [1, 2, 3, 4, 5];

وقمنا بتنفيذ السطر التالي:

// يقوم السطر التالي بتبديل قيمة أول عنصرين في المصفوفة
[array[0], array[1]] = [array[1], array[0]]
console.log(array)	// Output: [2, 1, 3, 4, 5]

وفي الدالة التي أرفقتها في الأعلى (shuffle) يتم إستعمال هذه الطريقة لخلط العناصر في المصفوفة بطريقة عشوائية 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
[array[i], array[j]] = [array[j], array[i]];

ES6 الجديد يسمح بتعيين متغيرين في وقت واحد. يكون هذا مفيدًا بشكل خاص عندما نريد تبديل قيم متغيرين , حيث يمكننا القيام بذلك في سطر واحد من التعليمات البرمجية. 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ 2 دقائق مضت قال Brahim Semmani:

فهمت ذالك لكن ليس بنسبة 100% 

فالعملية تتم في حلقة تنازلية i-- , و j رقم عشوائي من 0 حتى 4

والتساؤلات مطروحة عندي ؟؟  كيف تتم العملية بدون تكرار ..

شرط التكرار هو أن يكون المتغير i أكبر من صفر (i > 0)، وبما أن المتغير تبدأ قيمته من 4 (طول المصفوفة - 1) فستكون قيمة هذا المتغير 4 ثم في الدورة الثانية ستكون قيمته 3 ثم 2 في التي تليها ثم 1 في آخر دورة تكرار. (4 - 3 - 2 - 1)

ثم في السطر المسئول عن إسناد قيمة للمتغير j :

// قيمة عشوائية ما بين 0 و 4
let j = Math.floor(Math.random() * (i + 1));

أي أن قيمة المتغير j  ستكون ما بين 0 و 4 في أول دورة، وستكون قيمته ما بين 0 و 3 في ثاني دورة وهكذا. ( [0:4]  -  [0:3]  -  [0:2]  -  [0:1] )

ثم في السطر التالي يتم تبديل قيمة العنصر ذي الفهرس 4 index مع عنصر آخر مختار بطريقة عشوائية:

// في الدورة الأولى
// i = 4
// j = رقم عشوائي من 0 إلى 4
// أي سيتم تبديل العنصر 4 بأحد العناصر الأخرى في المصفوفة
[array[i], array[j]] = [array[j], array[i]];

يتم نفس الأمر في الدورة الثانية مع العنصر 3 (أي يتم تبديله مع أحد العناصر الأخرى) وهكذا إلى أن تنتهي آخر دورة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ الآن قال Brahim Semmani:

والعنصر j الا يتم تبديله بالعنصر i؟

يتم تبديله بالطبع، لكن هذا الأمر لن يؤثر على أي شيء لأن المتغير j يتم إسناد قمية عشوائية جديدة في كل دورة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 3 دقائق مضت قال سامح أشرف:

يقوم هذا السطر بتبديل قيمة عنصرين معًا، فمثلًا إن كان لدينا المصفوفة التالية:


let array = [1, 2, 3, 4, 5];

وقمنا بتنفيذ السطر التالي:


// يقوم السطر التالي بتبديل قيمة أول عنصرين في المصفوفة
[array[0], array[1]] = [array[1], array[0]]
console.log(array)	// Output: [2, 1, 3, 4, 5]

وفي الدالة التي أرفقتها في الأعلى (shuffle) يتم إستعمال هذه الطريقة لخلط العناصر في المصفوفة بطريقة عشوائية 

فهمت ذالك لكن ليس بنسبة 100% 

فالعملية تتم في حلقة تنازلية i-- , و j رقم عشوائي من 0 حتى 4

والتساؤلات مطروحة عندي ؟؟  كيف تتم العملية بدون تكرار ..

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 5 دقائق مضت قال سامح أشرف:

// في الدورة الأولى // i = 4 // j = رقم عشوائي من 0 إلى 4 // أي سيتم تبديل العنصر 4 بأحد العناصر الأخرى في المصفوفة [array[i], array[j]] = [array[j], array[i]];

والعنصر j الا يتم تبديله بالعنصر i؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...