11 KiB
title | localeTitle |
---|---|
Find the Symmetric Difference | العثور على الفرق متماثل |
تذكر استخدام Read-Search-Ask
إذا واجهتك مشكلة. حاول إقران البرنامج واكتب الكود الخاص بك
شرح المشكلة:
الاختلاف المتماثل (المشار إليه عادة بـ Δ) من مجموعتين هو مجموعة العناصر الموجودة في أي من المجموعتين ، ولكن ليس في كليهما.
على سبيل المثال ، يجب أن ينتج sym([1, 2, 3], [5, 2, 1, 4])
[3, 4, 5]
.
بعد التعريف المذكور أعلاه ، يمكن التعبير عن الفرق المتماثل من ثلاث مجموعات A و B و C كـ (A Δ B) Δ C
.
روابط ذات صلة
كائن الوسائط هو كائن Array -like الذي يرث الخاصية Array.length
فقط. تنظر بالتالي تحويلها إلى صفيف الفعلي.
حاول أن تحل المشكلة الآن
تلميح: 2
Deem كتابة دالة مساعد تقوم بإرجاع الفرق المتماثل من صفيفين في كل مكالمة بدلاً من محاولة الاختلاف بين كل المجموعات في وقت واحد.
حاول أن تحل المشكلة الآن
تلميح: 3
قم بتطبيق وظيفة المساعد على صفيف الوسيطات الذي تم إنشاؤه ، مما يقلل عناصره بشكل متكرر بشكل متكرر لتشكيل الناتج المتوقع.
ملحوظة في حالة وجود عدد فردي من المجموعات ، سيشمل الفرق المتماثل عناصر متطابقة موجودة في جميع المجموعات المحددة. على سبيل المثال؛
`A = {1, 2, 3} B = {2, 3, 4} C = {3, 4, 5}
(A ⋂ B) ⋂ C = {1, 4} &Intersection {3, 4, 5} A ⋂ B = {1, 3, 5} `
حاول أن تحل المشكلة الآن
تنبيه المفسد!
الحل قبل
الحل الأساسي للكود:
` function sym() { var args = []; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i]); }
function symDiff(arrayOne, arrayTwo) {
var result = [];
arrayOne.forEach(function(item) {
if (arrayTwo.indexOf(item) < 0 && result.indexOf(item) < 0) {
result.push(item);
}
});
arrayTwo.forEach(function(item) {
if (arrayOne.indexOf(item) < 0 && result.indexOf(item) < 0) {
result.push(item);
}
});
return result;
}
// Apply reduce method to args array, using the symDiff function
return args.reduce(symDiff);
}
`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
شرح الشفرة:
- يتم استخدام
push()
لكسر كائن الحجج إلى صفيف ، args . symDiff
الدالةsymDiff
على الفرق المتماثل بين مجموعتين. يتم استخدامه كدالة رد اتصال من أجل طريقةreduce()
تسمى على arg .arrayOne.forEach()
العناصر التي ينتج عنها والتي توجد فقط في arrayOne بالإضافة إلى أنها ليست جزءًا من النتيجة .arrayTwo.forEach()
العناصر التي ينتج عنها والتي توجد فقط في arrayTwo بالإضافة إلى أنها ليست جزءًا من النتيجة .- يتم إرجاع النتيجة ، وهو الفرق المتناظر. يعمل هذا الحل لأي عدد من المجموعات.
روابط ذات صلة
- جافا سكريبت ل
- JavaScript Array.length
- JavaScript Array.prototype.push ()
- JavaScript Array.prototype.forEach ()
- JavaScript Array.prototype.indexOf ()
حل الشفرة المتوسطة:
` function sym() {
// Convert the argument object into a proper array
var args = Array.prototype.slice.call(arguments);
// Return the symmetric difference of 2 arrays
var getDiff = function(arr1, arr2) {
// Returns items in arr1 that don't exist in arr2
function filterFunction(arr1, arr2) {
return arr1.filter(function(item) {
return arr2.indexOf(item) === -1;
});
}
// Run filter function on each array against the other
return filterFunction(arr1, arr2)
.concat(filterFunction(arr2, arr1));
};
// Reduce all arguments getting the difference of them
var summary = args.reduce(getDiff, []);
// Run filter function to get the unique values
var unique = summary.filter(function(elem, index, self) {
return index === self.indexOf(elem);
});
return unique;
}
// test here
sym([1, 2, 3], [5, 2, 1, 4]);
`
شرح الشفرة:
- يتم استخدام أسلوب
slice()
لكسر كائن الوسائط إلى صفيف ، args . getDiff
الدالةgetDiff
على الفرق المتماثل بين مجموعتين ، arr1 و arr2 . يتم استخدامه كدالة رد اتصال من أجل طريقةreduce()
تسمى على arg .- إرجاع
filterFunction()
الأول العناصر في arr1 غير موجودة في arr2 . - يتم تشغيل
filterFunction()
التاليfilterFunction()
على كل مصفوفة مقابل الآخر للتحقق من معكوس الشيك الأول للتفرد وسَلسَقه. - ملخص يتكون من الحجج المخفضة.
- يتم استخدام
filter()
في الملخص للاحتفاظ بالقيم الفريدة فقط ويتم إرجاع الفريدة .
روابط ذات صلة
- JavaScript Array.prototype.slice ()
- JavaScript Array.prototype.filter ()
- JavaScript Array.prototype.concat ()
الحل المتقدم للكود:
` function sym() { let argv = Array.from(arguments).reduce(diffArray); return argv.filter((element, index, array) => index === array.indexOf(element));//remove duplicates }
function diffArray(arr1, arr2) {
return arr1
.filter(element => !arr2.includes(element))
.concat(arr2.filter(element => !arr1.includes(element)));
}
// test here
sym([1, 2, 3], [5, 2, 1, 4]);
`
شرح الشفرة:
-
تقوم الدالة الرئيسية sym () بإنشاء مصفوفة من الوسيطات وتقليل عناصرها باستخدام الدالة المساعد diffArray () إلى صفيف واحد.
-
ترجع الدالة diffArray () الاختلاف المتماثل بين صفيفين عن طريق انتقاء عناصر فريدة في صفائف معلمات ؛ arr1 و arr2 .
روابط ذات صلة
ملاحظات للمساهمات:
- لا تقم بإضافة حلول مشابهة لأي حلول موجودة. إذا كنت تعتقد أنها مشابهة ولكن أفضل ، فحاول دمج (أو استبدال) الحل المشابه الموجود.
- أضف شرحًا لحلك.
- تصنيف الحل في واحدة من الفئات التالية - الأساسي والمتوسط والمتقدم .
- الرجاء إضافة اسم المستخدم الخاص بك فقط إذا قمت بإضافة أي محتويات رئيسية ذات صلة . ( لا تزيل أي أسماء مستخدمين حالية )
نرى
Wiki Challenge Solution Template
كمرجع.