ابحث عن عنصر min / max في صفيف في JavaScript


Answers

var max_of_array = Math.max.apply(Math, array);

للاطلاع على مناقشة كاملة ، انظر: http://aaroncrane.co.uk/2008/11/javascript_max_api/

Question

كيف يمكنني الحصول على الحد الأدنى أو الحد الأقصى لعنصر جافا سكريبت؟

مثال Psuedocode:

let array = [100, 0, 50]

array.min() //=> 0
array.max() //=> 100



استخدام عامل انتشار (ES6)

Math.max(...array);  // the same with "min" => Math.min(...array);

const array = [10, 2, 33, 4, 5];

console.log(
  Math.max(...array)
)




واجهت نفس المشكلة ، كنت بحاجة إلى الحصول على الحد الأدنى والحد الأقصى لقيم المصفوفة ، ولدهشتي ، لم تكن هناك وظائف مدمجة للصفائف. بعد قراءة الكثير ، قررت اختبار حلول "أفضل 3" بنفسي:

  1. حل منفصل: حلقة FOR للتحقق من كل عنصر في المصفوفة مقابل القيمة الحالية القصوى و / أو الدنيا ؛
  2. تطبيق الحل: إرسال الصفيف إلى وظائف Math.max و / أو Math.min الداخلية باستخدام تطبيق (خالية ، صفيف) ؛
  3. يقلل من حل: تكرار الاختيار ضد كل عنصر من صفيف باستخدام الحد (وظيفة).

كان رمز الاختبار هذا:

function GetMaxDISCRETE(A)
{   var MaxX=A[0];

    for (var X=0;X<A.length;X++)
        if (MaxX<A[X])
            MaxX=A[X];

    return MaxX;
}

function GetMaxAPPLY(A)
{   return Math.max.apply(null,A);
}

function GetMaxREDUCE(A)
{   return A.reduce(function(p,c)
    {   return p>c?p:c;
    });
}

تم ملء المجموعة A بـ 100،000 رقم صحيح عشوائي ، وتم تنفيذ كل وظيفة 10000 مرة على Mozilla Firefox 28.0 على سطح مكتب Intel Pentium 4 2.99GHz مع Windows Vista. الأوقات بالثواني ، استرداد بواسطة function.now () الدالة. كانت النتائج هذه ، مع 3 أرقام كسور والانحراف المعياري:

  1. حل منفصل: متوسط ​​= 0.161 ثانية ، sd = 0.078
  2. تطبيق الحل: متوسط ​​= 3.571 ثانية ، sd = 0.487
  3. تقليل الحل: متوسط ​​= 0.350 ثانية ، sd = 0.044

كان حل REDUCE أبطأ بنسبة 117٪ من الحل المنفصل. كان الحل APPLY الأسوأ ، 2،118 ٪ أبطأ من الحل المنفصل. بالإضافة إلى ذلك ، كما لاحظ بيتر ، فإنه لا يعمل مع المصفوفات الكبيرة (حوالي أكثر من 1000000 عنصر).

أيضًا ، لإكمال الاختبارات ، اختبرت هذا الرمز المنفصل الممتد:

var MaxX=A[0],MinX=A[0];

for (var X=0;X<A.length;X++)
{   if (MaxX<A[X])
        MaxX=A[X];
    if (MinX>A[X])
        MinX=A[X];
}

التوقيت: متوسط ​​= 0.218 ثانية ، sd = 0.094

لذا ، فهو أبطأ بنسبة 35٪ من الحل المنفصل البسيط ، ولكنه يسترد الحد الأقصى والقيم الدنيا في آنٍ واحد (أي حل آخر يتطلب مضاعفته مرتين على الأقل). وبمجرد أن يحتاج OP إلى كلا القيمتين ، يكون الحل المنفصل هو الخيار الأفضل (حتى كدالتين منفصلتين ، واحدة لحساب الحد الأقصى والأخرى لحساب الحد الأدنى ، سوف تتفوق على أفضل ثاني ، وهو حل REDUCE).




تكرار من خلال ، وتتبع كما تذهب.

var min = null;
var max = null;
for (var i = 0, len = arr.length; i < len; ++i)
{
    var elem = arr[i];
    if (min === null || min > elem) min = elem;
    if (max === null || max < elem) max = elem;
}
alert( "min = " + min + ", max = " + max );

سيؤدي هذا إلى ترك min / max null إذا لم تكن هناك عناصر في الصفيف. سيتم تعيين الحد الأدنى والحد الأقصى في مسار واحد إذا كان لدى المصفوفة أي عناصر.

يمكنك أيضًا توسيع Array باستخدام طريقة range باستخدام ما سبق للسماح بإعادة الاستخدام وتحسين إمكانية القراءة. انظر كمان عامل على http://jsfiddle.net/9C9fU/

Array.prototype.range = function() {

    var min = null,
        max = null,
        i, len;

    for (i = 0, len = this.length; i < len; ++i)
    {
        var elem = this[i];
        if (min === null || min > elem) min = elem;
        if (max === null || max < elem) max = elem;
    }

    return { min: min, max: max }
};

تستعمل ك

var arr = [3, 9, 22, -7, 44, 18, 7, 9, 15];

var range = arr.range();

console.log(range.min);
console.log(range.max);



أنا أحب أسلوب Linus التقليل () ، وخاصة بالنسبة للصفائف الكبيرة. ولكن طالما أنك تعلم أنك بحاجة إلى كل من min و max ، فلماذا تتكرر عبر الصفيف مرتين؟

Array.prototype.minmax = function () {
  return this.reduce(function (p, v) {
    return [(p[0] < v ? p[0] : v), (p[1] > v ? p[1] : v)];
  }, [this[0], this[0]]);
}

بالطبع ، إذا كنت تفضل النهج التكراري ، فيمكنك القيام بذلك أيضًا:

Array.prototype.minmax = function () {
    var mn = this[0], mx = this[0];
    this.forEach(function (v) {
        if (v < mn) mn = v;
        if (v > mx) mx = v;
    });
    return [mn, mx];
};



طريقة أخرى للقيام بذلك:

var arrayMax = Function.prototype.apply.bind(Math.max, null);

الاستعمال:

var max = arrayMax([2, 5, 1]);



إليك طريقة واحدة للحصول على أقصى قيمة من مجموعة من الكائنات. إنشاء نسخة (مع شريحة) ، ثم فرز النسخة بترتيب تنازلي والاستيلاء على العنصر الأول.

var myArray = [
    {"ID": 1, "Cost": 200},
    {"ID": 2, "Cost": 1000},
    {"ID": 3, "Cost": 50},
    {"ID": 4, "Cost": 500}
]

maxsort = myArray.slice(0).sort(function(a, b) { return b.ID - a.ID })[0].ID; 



ليرة تركية، والدكتور

var max = Math.max(...arrayOfNumbers);

الوثائق الرسمية Math.max() MDN

تستخدم الدالة التالية Function.prototype.apply() للبحث عن العنصر الأقصى في صفيف رقمي. getMaxOfArray([1, 2, 3]) يكافئ Math.max(1, 2, 3) ، ولكن يمكنك استخدام getMaxOfArray() على صفائف مبنية برمجياً من أي حجم.

function getMaxOfArray(numArray) {
    return Math.max.apply(null, numArray);
}

أو مع مشغل التوزيع الجديد ، يصبح الحصول على الحد الأقصى من المصفوفة أسهل بكثير.

var arr = [1, 2, 3];
var max = Math.max(...arr);



حل ChaosPandion يعمل إذا كنت تستخدم protoype. إذا لم يكن كذلك ، ضع في اعتبارك ما يلي:

Array.max = function( array ){
    return Math.max.apply( Math, array );
};

Array.min = function( array ){
    return Math.min.apply( Math, array );
};

سيعود ما ورد أعلاه NaN إذا لم تكن قيمة الصفيف عددًا صحيحًا لذا يجب أن تبني بعض الوظائف لتجنب ذلك. وإلا فإن هذا سيعمل.




الحل البسيط للعثور على الحد الأدنى للقيمة على Array من العناصر هو استخدام الدالة النموذجية من Array reduce :

A = [4,3,-9,-2,2,1];
A.reduce((min, val) => val < min ? val : min, A[0]); // returns -9

يحدد هذا الحد min إلى A[0] ، ثم يتحقق لـ A[1]...A[n] سواء كان أقل من الحد الحالي تمامًا. إذا تم تحديث A[i] < min ثم min إلى A[i] بإرجاع هذه القيمة.




دون النصي عملت لي في ndoejs:

 var numbers = [1, 2, 3, 4];
 console.log('Value:: ' + Math.max.apply(null, numbers) ); // 4



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

Array.max = function( array ){
    return Math.max.apply( Math, array );
};
Array.min = function( array ){
    return Math.min.apply( Math, array );
}; 

معززة من here (بواسطة جون رزيغ)




يعمل التعليمة البرمجية التالية لي:

var valueList = [10,4,17,9,3];
var maxValue = valueList.reduce(function(a, b) { return Math.max(a, b); });
var minValue = valueList.reduce(function(a, b) { return Math.min(a, b); });



إذا كنت تستخدم مكتبة sugar.js ، فيمكنك كتابة arr.min() و arr.max() كما تقترح. يمكنك أيضًا الحصول على قيم دقيقة و max من المصفوفات غير الرقمية.

min (map، all = false) لعرض العنصر في الصفيف ذي القيمة الأدنى. قد تكون الخريطة دالة تعين القيمة المراد فحصها أو سلسلة تعمل كاختصار. إذا كان كل شيء صحيحًا ، فسيتم عرض جميع القيم الدنيا في مصفوفة.

max (map، all = false) لعرض العنصر في الصفيف ذي القيمة الأكبر. قد تكون الخريطة دالة تعين القيمة المراد فحصها أو سلسلة تعمل كاختصار. إذا كان كل شيء صحيحًا ، فسيتم عرض جميع قيم الحد الأقصى في مصفوفة.

أمثلة:

[1,2,3].min() == 1
['fee','fo','fum'].min('length') == "fo"
['fee','fo','fum'].min('length', true) == ["fo"]
['fee','fo','fum'].min(function(n) { return n.length; }); == "fo"
[{a:3,a:2}].min(function(n) { return n['a']; }) == {"a":2}
['fee','fo','fum'].max('length', true) == ["fee","fum"]

توفر المكتبات مثل Lo-Dash و underscore.js أيضًا وظائف دقيقة و max مماثلة:

مثال من لو داش:

_.max([4, 2, 8, 6]) == 8
var characters = [
  { 'name': 'barney', 'age': 36 },
  { 'name': 'fred',   'age': 40 }
];
_.max(characters, function(chr) { return chr.age; }) == { 'name': 'fred', 'age': 40 }



أنا مندهش لا أحد أذكر الدالة تقليل.

var arr = [1, 10, 5, 11, 2]

var b = arr.reduce(function(previous,current){ 
                      return previous > current ? previous:current
                   });

b => 11
arr => [1, 10, 5, 11, 2]