كيفية الحصول على أصغر قيمة من مصفوفة في جافاسكريبت؟
المصفوفة justPrices تحتوي على قيم مثل:
[0] = 1.5
[1] = 4.5
[2] = 9.9.
كيف أعيد أصغر قيمة في المصفوفة؟
الإجابة رقم 1
أقصر رمز تعبيري لإيجاد القيمة الصغرى هو على الأرجح معايير الباقي:
const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
const min = Math.min(...arr)
console.log(min)معلمات الباقي هي في الأساس اختصار مريح لـ Function.prototype.apply عندما لا تحتاج إلى تغيير سياق الدالة:
var arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
var min = Math.min.apply(Math, arr)
console.log(min)هذا أيضًا استخدام رائع لـ Array.prototype.reduce:
const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
const min = arr.reduce((a, b) => Math.min(a, b))
console.log(min)قد يكون من المغري تمرير Math.min مباشرة إلى reduce، ومع ذلك فإن الدالة المستدعاة تتلقى معلمات إضافية:
callback (accumulator, currentValue, currentIndex, array)
في هذه الحالة بالذات قد يكون مطولًا بعض الشيء. reduce مفيد بشكل خاص عندما يكون لديك مجموعة من البيانات المعقدة التي تريد تجميعها في قيمة واحدة:
const arr = [{name: 'Location 1', distance: 14}, {name: 'Location 2', distance: 58}, {name: 'Location 3', distance: 20}, {name: 'Location 4', distance: 77}, {name: 'Location 5', distance: 66}, {name: 'Location 6', distance: 82}, {name: 'Location 7', distance: 42}, {name: 'Location 8', distance: 67}, {name: 'Location 9', distance: 42}, {name: 'Location 10', distance: 4}]
const closest = arr.reduce(
(acc, loc) =>
acc.distance < loc.distance
? acc
: loc
)
console.log(closest)وبالطبع يمكنك دائماً استخدام التكرار الكلاسيكي:
var arr,
i,
l,
min
arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
min = Number.POSITIVE_INFINITY
for (i = 0, l = arr.length; i < l; i++) {
min = Math.min(min, arr[i])
}
console.log(min)...لكن حتى التكرار الكلاسيكي يمكن أن يحصل على لمسة عصرية:
const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
let min = Number.POSITIVE_INFINITY
for (const value of arr) {
min = Math.min(min, value)
}
console.log(min)الإجابة رقم 2
بين جون ريسيج في هذا المقال كيف يمكن تحقيق ذلك عن طريق توسيع نموذج المصفوفة واستدعاء طريقة Math.min الأساسية التي للأسف لا تأخذ مصفوفة بل عددًا متغيرًا من المعطيات:
Array.min = function( array ){
return Math.min.apply( Math, array );
};
ثم:
var minimum = Array.min(array);
الإجابة رقم 3
أجد أن أسهل طريقة لإرجاع أصغر قيمة في مصفوفة هي استخدام عامل الانتشار (Spread Operator) على دالة Math.min().
return Math.min(...justPrices);
//returns 1.5 on example given تساعد الصفحة على MDN في فهمه بشكل أفضل: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min
إضافة صغيرة: هذا ينطبق أيضًا على دالة Math.max()
return Math.max(...justPrices); //يُرجع 9.9 حسب المثال المعطى.
آمل أن هذا يساعد!
الإجابة رقم 4
تحديث: استخدم إجابة دارين/جون ريسيج، فقط تذكر أنه لا تحتاج إلى تحديد thisArg لـ min، لذا Math.min.apply(null, arr) سيعمل بشكل جيد.
أو يمكنك فقط فرز المصفوفة والحصول على القيمة رقم 1: [2,6,7,4,1].sort()[0]
[!] ولكن بدون توفير دالة ترتيب أرقام مخصصة، سيعمل هذا فقط في حالة واحدة محدودة جدًا: الأعداد الموجبة الأقل من 10. انظر كيف قد ينكسر هذا:
var a = ['', -0.1, -2, -Infinity, Infinity, 0, 0.01, 2, 2.0, 2.01, 11, 1, 1e-10, NaN];
// correct:
a.sort( function (a,b) { return a === b ? 0 : a < b ? -1: 1} );
//Array [NaN, -Infinity, -2, -0.1, 0, "", 1e-10, 0.01, 1, 2, 2, 2.01, 11, Infinity]
// incorrect:
a.sort();
//Array ["", -0.1, -2, -Infinity, 0, 0.01, 1, 11, 1e-10, 2, 2, 2.01, Infinity, NaN]
وأيضًا، يتم تغيير المصفوفة في مكانها، وهو ما قد لا تريده.
الإجابة رقم 5
تخيل أن لديك هذا المصفوفة:
var arr = [1, 2, 3];
طريقة ES6:
var min = Math.min(...arr); //min=1
طريقة ES5:
var min = Math.min.apply(null, arr); //min=1
إذا كنت تستخدم D3.js، هناك دالة مفيدة تقوم بنفس الشيء، لكنها ستتجاهل القيم غير المعرفة وتتحقق أيضًا من الترتيب الطبيعي:
d3.max(المصفوفة[, الدالة_المُستَخرِجة])
يعيد القيمة القصوى في المصفوفة المعطاة باستخدام الترتيب الطبيعي. إذا كانت المصفوفة فارغة، يعيد غير معرف. يمكن تحديد دالة وصول اختيارية، وهي ما يعادل استدعاء array.map(accessor) قبل حساب القيمة القصوى.
على عكس الدالة المدمجة Math.max، تتجاهل هذه الطريقة القيم غير المعرفة؛ وهذا مفيد لتجاهل البيانات المفقودة. بالإضافة إلى ذلك، يتم مقارنة العناصر باستخدام الترتيب الطبيعي بدلاً من الترتيب العددي. على سبيل المثال، الحد الأقصى من السلاسل ["20 ", "3 "] هو "3"، بينما الحد الأقصى من الأعداد [20, 3] هو 20.
وهذا هو كود المصدر لإصدار D3 v4:
export default function(values, valueof) {
var n = values.length,
i = -1,
value,
max;
if (valueof == null) {
while (++i < n) { // Find the first comparable value.
if ((value = values[i]) != null && value >= value) {
max = value;
while (++i < n) { // Compare the remaining values.
if ((value = values[i]) != null && value > max) {
max = value;
}
}
}
}
}
else {
while (++i < n) { // Find the first comparable value.
if ((value = valueof(values[i], i, values)) != null && value >= value) {
max = value;
while (++i < n) { // Compare the remaining values.
if ((value = valueof(values[i], i, values)) != null && value > max) {
max = value;
}
}
}
}
}
return max;
}
