অবজেক্টের অ্যারেতে একটি বৈশিষ্ট্যের সর্বাধিক মান সন্ধান করা


413

আমি নীচের জেএসএন স্লাইসে সর্বাধিক "ওয়াই" মান পেতে একটি দ্রুত, পরিষ্কার এবং কার্যকর উপায়ের সন্ধান করছি:

[
  {
    "x": "8/11/2009",
    "y": 0.026572007
  },
  {
    "x": "8/12/2009",
    "y": 0.025057454
  },
  {
    "x": "8/13/2009",
    "y": 0.024530916
  },
  {
    "x": "8/14/2009",
    "y": 0.031004457
  }
]

এটির পথে যাওয়ার জন্য কি একটি লুপই একমাত্র উপায়? আমি একরকম ব্যবহারে আগ্রহী Math.max


4
আপনি কীভাবে অবজেক্টটি ফিরিয়ে আনবেন এবং কেবলমাত্র পাওয়া ন্যূনতম অ্যাটর মান?
মাইক লিয়নস

1
আমার নিজের উপকারের জন্য আমি এটিতে কিছু দ্রুত পারফেক্ট পরীক্ষা চালিয়েছি। jsperf.com/finding-the-max-value-an-array-of-objects
অ্যান্ডি

উত্তর:


739

yএতে বস্তুর সর্বাধিক মান সন্ধান করতে array:

Math.max.apply(Math, array.map(function(o) { return o.y; }))

47
সর্বাধিক মান পাওয়া গেছে এমন বস্তুটি কীভাবে ফিরিয়ে আনতে আপনি এই উত্তরটি প্রসারিত করতে পারেন? এটি খুব সহায়ক হবে, ধন্যবাদ!
মাইক লিয়নস

19
এই হৈ চৈ! কেউ এই ইচ্ছার সাহায্য আশা করি jsfiddle.net/45c5r246
মিলি

24
@ মাইক লাইন্স যদি আপনি এখনও আসল বস্তুটি পাওয়ার বিষয়ে চিন্তা করেন তবে: jsfiddle.net/45c5r246/34
tobyodavies

11
আপনার উত্তরটি বাড়িয়ে দিন!
জন উইলিয়াম ডোমিংগো

12
FWIW আমার বোধগম্যতা যখন আপনি কোনও ফাংশনে প্রয়োগের আবেদন করেন তখন এটি নির্দিষ্ট মান thisএবং অ্যারে হিসাবে নির্দিষ্ট যুক্তিগুলির একটি সিরিজ সহ ফাংশনটি কার্যকর করে । কৌশলটি হ'ল প্রয়োগটি অ্যারেটিকে প্রকৃত ফাংশন আর্গুমেন্টের একটি সিরিজে পরিণত করে। সুতরাং Math.max(0.0265, 0.0250, 0.024, 0.031)এক্ষেত্রে এটি শেষ পর্যন্ত thisফাংশনটি সম্পাদিত হওয়ার সাথে কল করে Math। কেন এটি Mathখোলামেলা হওয়া উচিত তা আমি দেখতে পাচ্ছি না , আমি মনে করি না যে ফাংশনটির একটি বৈধ প্রয়োজন this। ওহ এবং এখানে একটি যথাযথ ব্যাখ্যা: স্ট্যাকওভারফ্লো
ড্যানিয়েল সি

262

বস্তুর একটি অ্যারে যার সম্পত্তি "Y" এর সর্বাধিক মান রয়েছে সেই সন্ধান করুন

একটি উপায় অ্যারে হ্রাস ব্যবহার করা হবে ..

const max = data.reduce(function(prev, current) {
    return (prev.y > current.y) ? prev : current
}) //returns object

https://developer.mozilla.org/en-US/docs/Web/JavaScript/ উল্লেখ / গ্লোবাল_অবজেক্টস / অ্যারে / রেডুস http://caniuse.com/#search=reduce (IE9 এবং উপরে)

আপনার যদি আইই (কেবলমাত্র এজ) সমর্থন করার প্রয়োজন না হয় বা বাবেলের মতো একটি প্রাক-সংকলক ব্যবহার করতে পারেন তবে আপনি আরও ক্ষুদ্র বাক্য গঠন ব্যবহার করতে পারেন।

const max = data.reduce((prev, current) => (prev.y > current.y) ? prev : current)

7
এটি একটি ভাল উত্তর, তবে, আপনি একটি প্রাথমিক মান পাস করতে চান বা ডেটা অ্যারে ফাঁকা থাকলে আপনি একটি ত্রুটি পাবেন। অর্থাত্‍ বস্তুর স্ব-সংযোজন সূচকের জন্য। const max = data.reduce((prev, current) => (prev.y > current.y) ? prev : current, 1)
জুলিয়ানগনজালেজ 25:57

2
আপনি একটি ভাল বক্তব্য উত্থাপন করুন, আমি সম্ভবত null1 টির চেয়ে বেশি বেছে নেব
অ্যান্ডি পোহিল

25
দ্রষ্টব্য যে এটি সেই বস্তুকে প্রত্যাবর্তন করবে যেটির অবজেক্ট থেকে সর্বোচ্চ মান নয়। এটি আপনি যা চান তা হতে পারে বা নাও পারে। আমার ক্ষেত্রে এটি ছিল যা আমি চেয়েছিলাম। +1
জন

1
ভাল পরিপূরক উত্তর!
কিংবদন্তি

দুর্দান্ত উত্তর! প্রথমদিকে, হ্রাসের কারণে আমি দ্বিধায় পড়েছিলাম, তবে আমাদের যেভাবেই পুনরাবৃত্তি করা দরকার, তবে কেন হবে না?
শাপিরো ইয়াাকভ

146

পরিষ্কার এবং সহজ ES6 (ব্যাবেল)

const maxValueOfY = Math.max(...arrayToSearchIn.map(o => o.y), 0);

দ্বিতীয় প্যারামিটারটি arrayToSearchInখালি থাকলে একটি ডিফল্ট মান নিশ্চিত করা উচিত ।


8
এছাড়াও এটি জেনে রাখা ভাল যে এটি খালি অ্যারের জন্য ফিরে আসে -Infinity( সত্যবাদী মান)
icl7126

1
এটি এখন বাবেল ছাড়া বেশিরভাগ আধুনিক ব্রাউজারগুলিতে সমর্থিত।
ইউজিন কুলাবোভভ

20
এটি -Infinityখালি অ্যারে হিসাবে প্রত্যাবর্তন করার সাথে সাথে আপনি একটি প্রাথমিক মানটি পাস করতে পারেনMath.max(...state.allProjects.map(o => o.id), 1);
জুলিয়ানগনজালেজ 25:58

5
এটি এখনই গ্রহণযোগ্য উত্তর হওয়া উচিত ... অবশ্যই আরও নিবিড় পদ্ধতির।
নিকব

1
বিয়োগ মানের জন্য হাতল ক্ষেত্রে পরিবর্তন 0করতে arrayToSearchIn[0].y। টাইম জটিলতা comparision: stackoverflow.com/a/53654364/860099
কামিল Kiełczewski

40

ওয়ান লাইন গাছের তুলনা যা বিয়োগ সংখ্যার কেস পরিচালনা করে ( aঅ্যারে ইনপুট ):

var maxA = a.reduce((a,b)=>a.y>b.y?a:b).y;  // 30 chars time complexity:  O(n)

var maxB = a.sort((a,b)=>b.y-a.y)[0].y;     // 27 chars time complexity:  O(nlogn)

var maxC = Math.max(...a.map(o=>o.y));      // 26 chars time complexity: >O(2n)

এখানে সম্পাদনযোগ্য উদাহরণ । এর থেকে আইডিয়াস: ম্যাক্সএ , ম্যাক্সবি এবং ম্যাকসিসি ( ম্যাক্সবির পার্শ্ব প্রতিক্রিয়া হ'ল অ্যারেটি aস্থান পরিবর্তন হওয়ার কারণে পরিবর্তিত হয়েছে sort)।

বড় অ্যারেগুলির জন্য Math.max...ব্যতিক্রম ছুঁড়ে ফেলা হবে: সর্বাধিক কল স্ট্যাকের আকার ছাড়িয়ে গেছে (Chrome 76.0.3809, সাফারি 12.1.2, তারিখ 2019-09-13)


2
কাজটি সম্পাদন করার জন্য খুব চালাক পদ্ধতি। সুন্দর
তেত্রাদেভ

দুঃখিত, ভুল করে ডাউনভোটেড এবং আপনার প্রশ্নটি সম্পাদনা না করে পূর্বাবস্থায় ফেলা যায়নি কারণ অনেক বেশি সময় কেটে গেছে।
গন্টার জ্যাচবাউয়ার

ধন্যবাদ দুর্দান্ত বিশ্লেষণ।
d337

উপলব্ধ বিকল্পগুলির এই ভাঙ্গন এবং পদ্ধতির মধ্যে পার্থক্যের জন্য আপনাকে ধন্যবাদ।
ফিস্টঅফফুরি 15

একটি বিষয় উল্লেখ করার জন্য বিকল্প বিটি শেষের দিকে yছেড়ে দিয়ে সর্বাধিক মান সহ পুরো বস্তুটি পাওয়া অনেক সহজ করে তোলে .y
ফিস্টঅফফুরি 15

23

ভাল, প্রথমে আপনার জেএসএন স্ট্রিংটি পার্স করা উচিত, যাতে আপনি সহজেই এর সদস্যদের অ্যাক্সেস করতে পারেন:

var arr = $.parseJSON(str);

mapমানগুলি বের করার জন্য পদ্ধতিটি ব্যবহার করুন :

arr = $.map(arr, function(o){ return o.y; });

তারপরে আপনি maxপদ্ধতিতে অ্যারে ব্যবহার করতে পারেন :

var highest = Math.max.apply(this,arr);

বা ওয়ান-লাইনার হিসাবে:

var highest = Math.max.apply(this,$.map($.parseJSON(str), function(o){ return o.y; }));

15
এটির সাথে ট্যাগ নেইjQuery
রবিন ভ্যান বালেন

1
@ রোবিনভান বায়ালেন: হ্যাঁ, আপনি ঠিক বলেছেন। তবে এটি জেএসওএন-এর সাথে ট্যাগ করা হয়েছে তবে গ্রহণযোগ্য উত্তর সেটিকে উপেক্ষা করে এবং টোযোডাভিসগুলিও এটিকে বিষয়টির বিষয় থেকে সরিয়ে দিয়েছে ... সম্ভবত আমার প্রশ্নের উত্তর দেওয়া উচিত ...;)
গুফা

8
@ টোবায়ডাভিসরা এটি ট্যাগ হওয়ার সত্যটি উপেক্ষা করলে এটি বেশি কিছু যায় আসে না json- তিনি তার উত্তরে কোনও বাহ্যিক জাভাস্ক্রিপ্ট লাইব্রেরি ব্যবহার করছেন না :)
রবিন ভ্যান বালেন

23

আমি ব্যাখ্যা করতে চাই ধীরে ধীরে গৃহীত উত্তরটি ধাপে ধাপে :

var objects = [{ x: 3 }, { x: 1 }, { x: 2 }];

// array.map lets you extract an array of attribute values
var xValues = objects.map(function(o) { return o.x; });
// es6
xValues = Array.from(objects, o => o.x);

// function.apply lets you expand an array argument as individual arguments
// So the following is equivalent to Math.max(3, 1, 2)
// The first argument is "this" but since Math.max doesn't need it, null is fine
var xMax = Math.max.apply(null, xValues);
// es6
xMax = Math.max(...xValues);

// Finally, to find the object that has the maximum x value (note that result is array):
var maxXObjects = objects.filter(function(o) { return o.x === xMax; });

// Altogether
xMax = Math.max.apply(null, objects.map(function(o) { return o.x; }));
var maxXObject = objects.filter(function(o) { return o.x === xMax; })[0];
// es6
xMax = Math.max(...Array.from(objects, o => o.x));
maxXObject = objects.find(o => o.x === xMax);


document.write('<p>objects: ' + JSON.stringify(objects) + '</p>');
document.write('<p>xValues: ' + JSON.stringify(xValues) + '</p>');
document.write('<p>xMax: ' + JSON.stringify(xMax) + '</p>');
document.write('<p>maxXObjects: ' + JSON.stringify(maxXObjects) + '</p>');
document.write('<p>maxXObject: ' + JSON.stringify(maxXObject) + '</p>');

আরো তথ্য:


দুর্দান্ত ব্যাখ্যা! কোড কমেন্টে না থাকলে এটি পড়া কিছুটা সহজ হতে পারে তবে এখনও - দুর্দান্ত কাজ
মার্টিন

12
var data = [
  { 'name': 'Vins', 'age': 27 },
  { 'name': 'Jan', 'age': 38 },
  { 'name': 'Alex', 'age': 80 },
  { 'name': 'Carl', 'age': 25 },
  { 'name': 'Digi', 'age': 40 }
];
var max = data.reduce(function (prev, current) {
   return (prev.age > current.age) ? prev : current
});
//output = {'name': 'Alex', 'age': 80}

2
@ অ্যান্ডিপোলহিলের উত্তর থেকে এটি কীভাবে আলাদা?
লুইস

7

আপনি যদি (বা, এখানে কেউ) lodashইউটিলিটি লাইব্রেরি ব্যবহার করতে মুক্ত হন তবে এটির একটি ম্যাক্সবাই রয়েছে ফাংশন রয়েছে যা আপনার ক্ষেত্রে খুব সহজ হবে।

অতএব আপনি এই হিসাবে ব্যবহার করতে পারেন:

_.maxBy(jsonSlice, 'y');

5

বা একটি সাধারণ সাজান! এটা বাস্তবেই রাখ :)

array.sort((a,b)=>a.y<b.y)[0].y

দুর্দান্ত ধারণা +1 (সংক্ষিপ্ততম কোড), তবে ছোট বাগ রয়েছে - এতে পরিবর্তন a.y<a.yকরুন b.y-a.y। টাইম জটিলতা এখানে তুলনা: stackoverflow.com/a/53654364/860099
কামিল Kiełczewski

2
সর্বাধিক সন্ধান O (n)। এটি O (nlogn)। দক্ষতা ত্যাগ না করা পর্যন্ত সহজ কোড লেখা ভাল।
ওয়াইল্ডহ্যামার

@ ওল্ডহ্যামার - আসলে আপনি কোনও বাধাটিকে অনুকূল করছেন বলে প্রমাণ পেলে মাইক্রো-অপটিমাইজেশনটি মূল্যবান। । বেশিরভাগ ক্ষেত্রে, সাধারণ কোড উচ্চ-দক্ষ কোডের চেয়ে ভাল পছন্দ।
কামিল কিয়েসজেউস্কি

@ কামিলকিএকজেজেউস্কি এই নিবন্ধের উভয় অ্যারের তুলনা একই সময়ে জটিলতা রয়েছে তাদের পার্থক্যটির সহগের মধ্যে। উদাহরণস্বরূপ, সমাধানটি খুঁজতে একজন এন সময়সীমা গ্রহণ করে অন্যটি 7n হয়। সময় জটিলতার তত্ত্বের ক্ষেত্রে, এই দুটিই হ'ল (এন)। আমরা সর্বাধিক সন্ধানের সমস্যায় যা বলছি তা হ'ল ও (এন) এর সাথে (এন লগন) তুলনা। এখন আপনি যদি গ্যারান্টি দিতে পারেন যে n 10 এর বেশি হয় না তবে আপনি নিজের সমাধানটি ব্যবহার করতে পারেন অন্যথায় ও (এন) অ্যালগোরিদম সর্বদা বিজয়ী এবং কার্যকারিতা (ব্যবহারকারীর অভিজ্ঞতা) বরাবর বিকাশকারী অভিজ্ঞতার আগে থাকে (শিল্পের লোকদের জিজ্ঞাসা করুন, তারা আপনাকে বলে যে!) ।
ওয়াইল্ডহ্যামার

@Wildhammer নাঃ - প্রমাণ করা - এমনকি আপনার অ্যারের এন = 10000 উপাদান আছে ব্যাবহারকারী না পার্থক্য দেখতে পাবেন এখানে । পারফরম্যান্স অপটিমাইজেশন কেবলমাত্র অ্যাপ্লিকেশন ব্যথনেইকের জন্য ভাল (যেমন আপনার বড় অ্যারে প্রক্রিয়া করা প্রয়োজন) - তবে বেশিরভাগ ক্ষেত্রে পারফরম্যান্স-ফোকাসটি ভুল পদ্ধতির এবং সময় (= অর্থ) অপচয় করা ting এটি পরিচিত কোড পদ্ধতির ভুল হিসাবে পরিচিত - আরও পড়ুন: "মাইক্রো-অপ্টিমাইজেশন"
কামিল কিয়েসজেউস্কি




1
Here is very simple way to go:

Your DataSet.

let numberArray = [
  {
    "x": "8/11/2009",
    "y": 0.026572007
  },
  {
    "x": "8/12/2009",
    "y": 0.025057454
  },
  {
    "x": "8/13/2009",
    "y": 0.024530916
  },
  {
    "x": "8/14/2009",
    "y": 0.031004457
  }
]

1. First create Array, containing all the value of Y
let result = numberArray.map((y) => y)
console.log(result) >> [0.026572007,0.025057454,0.024530916,0.031004457]

2. let maxValue = Math.max.apply(null, result)
console.log(maxvalue) >> 0.031004457

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.