javascript - tutorial - w3schools




জাভাস্ক্রিপ্ট মধ্যে একটি অ্যারের মিনি/সর্বোচ্চ উপাদান খুঁজুন (20)

Math.min এবং Math.max

Math.min এবং Math.max উভয় পুনরাবৃত্তিমূলক ক্রিয়াকলাপ যা সম্ভবত বড় অ্যারের জন্য crach (~ 10⁷ আইটেমের চেয়ে বড়)।

পরিবর্তে, আপনি পুরানো জাভাস্ক্রিপ্ট loops ব্যবহার করতে পারেন:

function getMinMax(arr) {
    return arr.reduce(({min, max}, v) => ({
        min: min < v ? min : v,
        max: max > v ? max : v,
    }), { min: arr[0], max: arr[0] });
}

অথবা (ভাল রান টাইম) :

function getMinMax(arr) {
    let min = arr[0];
    let max = arr[0];
    let i = arr.length;

    while (i--) {
        min = arr[i] < min ? arr[i] : min;
        max = arr[i] > max ? arr[i] : max;
    }
    return { min, max };
}

* 1,000,000 আইটেম দিয়ে পরীক্ষা করা হয়েছে:
শুধু একটি রেফারেন্সের জন্য, প্রথম ফাংশন রান-টাইম (আমার মেশিনে) ছিল 15.84 মিমি, দ্বিতীয় ফাংশন বনাম 4.3২ মি।

কিভাবে আমি সহজে একটি জাভাস্ক্রিপ্ট অ্যারের মিনি বা সর্বোচ্চ উপাদান পেতে পারি?

উদাহরণ Psuedocode:

let array = [100, 0, 50]

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

TL; ড

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

অফিসিয়াল Math.max() MDN ডকুমেন্টেশন

নিচের ফাংশনটি সংখ্যাসূচক অ্যারে সর্বোচ্চ উপাদান খুঁজে পেতে Function.prototype.apply() ব্যবহার করে। getMaxOfArray([1, 2, 3]) Math.max(1, 2, 3) সমতুল্য, তবে আপনি কোন আকারের প্রোগ্রামমেটিক্যাল getMaxOfArray() এ্যারে getMaxOfArray() ব্যবহার করতে পারেন।

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

অথবা নতুন স্প্রেড অপারেটর দিয়ে , সর্বাধিক একটি অ্যারে পেয়ে অনেক সহজ হয়ে যায়।

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

অন্যরা ইতোমধ্যে কিছু সমাধান দিয়েছেন যা তারা Array.prototype বৃদ্ধি Array.prototype । এই উত্তরটি আমি চাই যে এটি Math.min.apply( Math, array ) বা Math.min.apply( null, array ) হওয়া উচিত তা স্পষ্ট Math.min.apply( Math, array ) হবে। সুতরাং কোন প্রসঙ্গ ব্যবহার করা উচিত, Math বা null ?

apply প্রেক্ষাপটে null পাস apply , প্রসঙ্গটি বিশ্বব্যাপী বস্তুর (ব্রাউজারের ক্ষেত্রে window অবজেক্ট) ডিফল্ট হবে। প্রসঙ্গ হিসাবে Math বস্তুটি পাস করা সঠিক সমাধান হবে, তবে এটি ক্ষণস্থায়ী null আঘাত করবে না। Math.max ফাংশন সজ্জিত করার সময় null কারণ হতে পারে এখানে একটি উদাহরণ:

// decorate Math.max
(function (oldMax) {
    Math.max = function () {
        this.foo(); // call Math.foo, or at least that's what we want

        return oldMax.apply(this, arguments);
    };
})(Math.max);

Math.foo = function () {
    print("foo");
};

Array.prototype.max = function() {
  return Math.max.apply(null, this); // <-- passing null as the context
};

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

print(max);

উপরোক্ত ব্যতিক্রমটি this.foo পাবে কারণ এই। this.foo window.foo হিসাবে মূল্যায়ন করা হবে, যা undefined । যদি আমরা ম্যাথের সাথে null প্রতিস্থাপন করি, তবে জিনিসগুলি প্রত্যাশিত হিসাবে কাজ করবে এবং স্ট্রিং "foo" স্ক্রিনে মুদ্রিত হবে (আমি মোজিলা রাহিন ব্যবহার করে এটি পরীক্ষা করেছি)।

আপনি বেশিরভাগই অনুমান করতে পারেন যে কেউ সাজিয়েছেন Math.max তাই, Math.max পাসিং সমস্যা ছাড়াই কাজ করবে।



আপনি আপনার প্রকল্পে যে কোনও ফাংশন ব্যবহার করতে পারেন:

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

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

এবং তারপর আপনি অ্যারের পাশে ফাংশন কল করতে পারেন:

var myArray = [1,2,3,4,5,6,7];
var maximo = getMax(myArray); //return the highest number

আপনি যদি লাইব্রেরি sugar.js লাইব্রেরি ব্যবহার করেন তবে আপনি arr.min() এবং arr.max() লিখতে পারেন। আপনি অ সংখ্যাসূচক অ্যারে থেকে মিনি এবং সর্বোচ্চ মান পেতে পারেন।

মিনিট (মানচিত্র, সব = মিথ্যা) সর্বনিম্ন মান সহ অ্যারের উপাদানটি ফেরত দেয়। মানচিত্র একটি ফাংশন ম্যাপিং হতে পারে মান যাচাই করা বা একটি শর্টকাট হিসাবে অভিনয় একটি স্ট্রিং। যদি সব সত্য হয়, একটি অ্যারে সব মিনি মান ফিরে হবে।

সর্বাধিক (মানচিত্র, সমস্ত = মিথ্যা) সর্বাধিক মান সহ অ্যারের উপাদানটি ফেরত দেয়। মানচিত্র একটি ফাংশন ম্যাপিং হতে পারে মান যাচাই করা বা একটি শর্টকাট হিসাবে অভিনয় একটি স্ট্রিং। যদি সব সত্য হয়, একটি অ্যারে সব সর্বোচ্চ মান ফেরত দেবে।

উদাহরণ:

[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([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 }

আমারও একই সমস্যা ছিল, আমার অ্যারের ন্যূনতম এবং সর্বাধিক মানগুলি পেতে হয়েছিল এবং আমার অবাক, অ্যারের জন্য কোনও অন্তর্নির্মিত ফাংশন ছিল না। অনেক পড়ার পর, আমি নিজেকে "শীর্ষ 3" সমাধানগুলি পরীক্ষা করার সিদ্ধান্ত নিয়েছি:

  1. বিচ্ছিন্ন সমাধান: বর্তমান সর্বোচ্চ এবং / অথবা মিনি মানের বিপরীতে অ্যারের প্রতিটি উপাদান পরীক্ষা করার জন্য একটি লুপ;
  2. আবেদন সমাধান: Math.max এবং / অথবা Math.min এ অ্যারে পাঠানো প্রয়োগ করে অভ্যন্তরীণ ফাংশন (নল, অ্যারে) ব্যবহার করে;
  3. RedUCE সমাধান: হ্রাস (ফাংশন) ব্যবহার করে অ্যারের প্রতিটি উপাদান বিরুদ্ধে একটি চেক recursing।

পরীক্ষা কোড এই ছিল:

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 র্যান্ডম পূর্ণসংখ্যা সংখ্যার সাথে পূর্ণ ছিল, প্রতিটি ফাংশনটি উইন্ডোজ ভিস্তা সহ পেন্টিয়াম 4 2.99GHz ডেস্কটপে মোজিলা ফায়ারফক্স 28.0 এ 10,000 বার কার্যকর করা হয়েছিল। সময় সেকেন্ডের মধ্যে, performance.now () ফাংশন দ্বারা পুনরুদ্ধার করা হয়। ফলাফলগুলি তিনটি আংশিক সংখ্যা এবং মান বিচ্যুতির সাথে ছিল:

  1. বিচ্ছিন্ন সমাধান: গড় = 0.161s, এসডি = 0.078
  2. প্রয়োগ সমাধান: গড় = 3.571 গুলি, sd = 0.487
  3. RedUCE সমাধান: গড় = 0.350 গুলি, sd = 0.044

REDUCE সমাধান বিচ্ছিন্ন সমাধান তুলনায় 117% ধীর। APPLY সমাধান খারাপ ছিল, বিচ্ছিন্ন সমাধান চেয়ে 2,118% ধীর। পাশাপাশি, পিটার যেমন বলেছিলেন, এটি বড় অ্যারের জন্য কাজ করে না (প্রায় 1,000,000 টি উপাদান)।

এছাড়াও, পরীক্ষাগুলি সম্পূর্ণ করার জন্য, আমি এই বর্ধিত বিযুক্ত কোডটি পরীক্ষা করেছি:

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 গুলি, এসডি = 0.094

সুতরাং, এটি সহজ বিচ্ছিন্ন সমাধান থেকে 35% ধীর, তবে এটি একবারে সর্বাধিক এবং ন্যূনতম মান উভয় পুনরুদ্ধার করে (অন্য সমাধানটি কমপক্ষে দুইবার তাদের পুনরুদ্ধার করবে)। একবার ওপিকে উভয় মূল্যের প্রয়োজন হলে, বিচ্ছিন্ন সমাধানটি সর্বোত্তম পছন্দ (এমনকি দুটি পৃথক ফাংশন হিসাবেও, একটিকে সর্বনিম্ন গণনা করার জন্য এবং অন্যতম গণনা করার জন্য, তারা দ্বিতীয় সেরাটি, REDUCE সমাধানটি অতিক্রম করবে)।


আমি এক হ্রাস ফাংশন উল্লেখ না বিস্মিত।

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]

এই আপনার উদ্দেশ্য অনুসারে হতে পারে।

Array.prototype.min = function(comparer) {

    if (this.length === 0) return null;
    if (this.length === 1) return this[0];

    comparer = (comparer || Math.min);

    var v = this[0];
    for (var i = 1; i < this.length; i++) {
        v = comparer(this[i], v);    
    }

    return v;
}

Array.prototype.max = function(comparer) {

    if (this.length === 0) return null;
    if (this.length === 1) return this[0];

    comparer = (comparer || Math.max);

    var v = this[0];
    for (var i = 1; i < this.length; i++) {
        v = comparer(this[i], v);    
    }

    return v;
}

এটি করার আরেকটি উপায়:

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

ব্যবহার:

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

নিম্নলিখিত কোড আমার জন্য কাজ করে:

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); });

পরিবর্তে Math.max / Math.min ব্যবহার করতে বিল্ট-ইন অ্যারে অবজেক্টকে কিভাবে Math.min :

Array.prototype.max = function() {
  return Math.max.apply(null, this);
};

Array.prototype.min = function() {
  return Math.min.apply(null, this);
};

এখানে একটি JSFiddle

বিল্ট-ইনগুলিকে বাড়ানো অন্যান্য লাইব্রেরির সাথে সংঘর্ষ সৃষ্টি করতে পারে (কিছু দেখুন), তাই আপনি সরাসরি আপনার অ্যারেতে ' Math.xxx() ' apply করতে আরও বেশি আরামদায়ক হতে apply :

var min = Math.min.apply(null, arr),
    max = Math.max.apply(null, arr);

অন্যথায়, আপনার ব্রাউজারটি ECMAScript 6 সমর্থন করে বলে আপনি স্প্রেড অপারেটরটি ব্যবহার করতে পারেন যা apply পদ্ধতিতে একইভাবে কাজ করে:

var min = Math.min( ...arr ),
    max = Math.max( ...arr );

বড় অ্যারের জন্য (~ 10⁷ উপাদান), Math.min এবং Math.max নোড.জেসে একটি রেঞ্জের ত্রুটি (সর্বোচ্চ কল স্ট্যাকের আকার অতিক্রম করেছে)

বড় অ্যারে জন্য, একটি দ্রুত এবং নোংরা সমাধান হল:

Array.prototype.min = function() {
    var r = this[0];
    this.forEach(function(v,i,a){if (v<r) r=v;});
    return r;
};

বস্তুর একটি অ্যারের থেকে সর্বোচ্চ মান পেতে এখানে একটি উপায়। একটি অনুলিপি তৈরি করুন (স্লাইস সহ), তারপরে নিচের ক্রমটিতে কপিটি সাজান এবং প্রথম আইটেমটি ধরুন।

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; 

যদি আপনি Math.max.apply ব্যবহার সম্পর্কে আমার মত প্যারানোড Math.max.apply (যা MDN অনুসারে বড় অ্যারে দেওয়া হলে ত্রুটি হতে পারে), এটি চেষ্টা করুন:

function arrayMax(array) {
  return array.reduce(function(a, b) {
    return Math.max(a, b);
  });
}

function arrayMin(array) {
  return array.reduce(function(a, b) {
    return Math.min(a, b);
  });
}

অথবা, ES6:

function arrayMax(array) {
  return array.reduce((a, b) => Math.max(a, b));
}

function arrayMin(array) {
  return array.reduce((a, b) => Math.min(a, b));
}

বেনামী ফাংশন দুর্ভাগ্যবশত প্রয়োজনীয় (পরিবর্তে Math.max.bind(Math) ব্যবহার করার পরিবর্তে reduce কারণ এটি কেবলমাত্র ফাংশনটির a এবং b পাস করে না, তবে i এবং অ্যারেটির একটি রেফারেন্সও, তাই আমাদের নিশ্চিত করতে হবে যে আমরা সেইসাথে যারা উপর max কল করার চেষ্টা করবেন না।


সমস্ত উত্তর পড়ার পর, আমি ভাবলাম যে সবচেয়ে ভাল সমাধান (যা এখানে সরবরাহ করা হয়নি) লিখতে ভাল হবে। যদি আপনার মান অ্যারে হাজারের দশকে বৃদ্ধি পায় তবে একটি হাইব্রিড কৌশল ব্যবহার করুন: একটি সময়ে আপনার ফাংশনটি অ্যারের অংশগুলিতে প্রয়োগ করুন:

function minOfArray(arr) {
  var min = Infinity;
  var QUANTUM = 32768;

  for (var i = 0, len = arr.length; i < len; i += QUANTUM) {
    var submin = Math.min.apply(null, 
                                arr.slice(i, Math.min(i+QUANTUM, len)));
    min = Math.min(submin, min);
  }

  return min;
}

var min = minOfArray([5, 6, 2, 3, 7]);

উত্স: এমডিএন


স্প্রেড অপারেটর ব্যবহার করে (ES6)

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

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

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



Math.max() বা Math.min()

Math.max(10, 20);   //  20
Math.min(-10, -20); // -20

নিচের ফাংশনটি সংখ্যাসূচক অ্যারে সর্বোচ্চ উপাদান খুঁজে পেতে Function.prototype.apply() ব্যবহার করে। getMaxOfArray([1, 2, 3]) Math.max(1, 2, 3) সমতুল্য, তবে আপনি কোন আকারের প্রোগ্রামমেটিক্যাল getMaxOfArray() এ্যারে getMaxOfArray() ব্যবহার করতে পারেন।

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

অথবা নতুন স্প্রেড অপারেটর দিয়ে, সর্বাধিক একটি অ্যারে পেয়ে অনেক সহজ হয়ে যায়।

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





javascript