किसी सरणी में किसी विशेषता का अधिकतम मान ढूँढना


413

मैं निम्नलिखित JSON स्लाइस में अधिकतम "y" मान प्राप्त करने के लिए वास्तव में त्वरित, स्वच्छ और कुशल तरीके की तलाश कर रहा हूं:

[
  {
    "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
अगर आप अभी भी वास्तविक वस्तु पाने के बारे में परवाह करते हैं तो @MikeLyons: jsfiddle.net/45c5r246/34
जुलाब

11
कृपया अपना उत्तर समाप्त करें!
जॉन विलियम डोमिंगो

12
FWIW मेरी समझ यह है कि जब आप किसी फ़ंक्शन पर लागू होते हैं, तो यह फ़ंक्शन को एक निर्दिष्ट मान thisऔर सरणी के रूप में निर्दिष्ट तर्कों की एक श्रृंखला के साथ निष्पादित करता है । चाल है कि लागू सरणी वास्तविक समारोह तर्क की एक श्रृंखला में बदल जाता है। तो इस मामले में यह अंत में निष्पादित कार्य के Math.max(0.0265, 0.0250, 0.024, 0.031)साथ कॉल thisकरता है Math। मैं नहीं देख सकता कि यह Mathस्पष्ट रूप से क्यों होना चाहिए , मुझे नहीं लगता कि फ़ंक्शन को एक वैध की आवश्यकता है this। ओह और यहाँ एक उचित स्पष्टीकरण है: stackoverflow.com/questions/21255138/…
डैनियल सी

263

उस ऑब्जेक्ट को ढूंढें जिसकी संपत्ति "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/Reference/Global_Objects/Array/Reduce http://caniuse.com/#search=reduce (IE9 and above)

यदि आपको IE (केवल एज) का समर्थन करने की आवश्यकता नहीं है, या पहले से संकलक का उपयोग कर सकते हैं जैसे कि बैबेल आप अधिक टिंट सिंटैक्स का उपयोग कर सकते हैं।

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)
जूलियांगज़ेलीज़

2
आप एक अच्छा बिंदु बढ़ा, मैं शायद का चयन करेंगे nullसे अधिक 1.
एंडी Polhill

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

5
यह अब स्वीकृत उत्तर होना चाहिए ... निश्चित रूप से अधिक प्रवृत्त दृष्टिकोण।
निक

1
माइनस मान में परिवर्तन के 0लिए केस को संभालने के लिए arrayToSearchIn[0].y। समय जटिलता की तुलना: stackoverflow.com/a/53654364/860099
कामिल Kiełczewski

41

वृक्षों की तुलना ONELINERS जो माइनस नंबर केस ( 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)

यहाँ संपादन योग्य उदाहरण । से विचार: maxA , maxB और maxC ( maxB का साइड इफेक्ट यह है कि सरणी aबदल जाता है क्योंकि sortइन-प्लेस है)।

बड़े सरणियों के लिए Math.max...अपवाद फेंक देंगे: अधिकतम कॉल स्टैक आकार पार हो गया (क्रोम 76.0.3809, सफारी 12.1.2, तारीख 2019-09-13)


2
कार्य को पूरा करने के लिए बहुत ही चतुर तरीके। अच्छा
TetraDev

क्षमा करें, गलती से अधोगामी और आपके प्रश्न को संपादित किए बिना पूर्ववत नहीं कर सकता क्योंकि बहुत समय बीत चुका है।
गुंटर Zöchbauer

धन्यवाद महान विश्लेषण।
d337

उपलब्ध विकल्पों और दृष्टिकोणों के बीच अंतर के इस टूटने के लिए धन्यवाद।
FistOfFury

इंगित करने के लिए एक बात विकल्प बी है जो अंत में yबंद छोड़कर अधिकतम वस्तु के साथ पूरी वस्तु प्राप्त करना बहुत आसान बनाता है .y
FistOfFury 15

23

ठीक है, पहले आपको JSON स्ट्रिंग को पार्स करना चाहिए, ताकि आप आसानी से इसके सदस्यों तक पहुंच सकें:

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
रॉबिन वैन Baalen

1
@ रॉबिनवनबलेन: हाँ, आप सही हैं। हालांकि इसे JSON के साथ टैग किया गया है, लेकिन स्वीकृत उत्तर को नजरअंदाज कर दिया गया है, और tobyodavies ने उस प्रश्न के विषय से भी हटा दिया है ... शायद मुझे सवाल में jquery जोड़ना चाहिए ...;)
गुफ्फा

8
यह बहुत मायने नहीं रखता अगर @tobyodavies ने इस तथ्य को नजरअंदाज कर दिया कि यह टैग किया गया था 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
यह @ AndyPolhill के उत्तर से कैसे भिन्न है?
लुईस

7

यदि आप (या, यहाँ कोई है) lodashउपयोगिता पुस्तकालय का उपयोग करने के लिए स्वतंत्र हैं , तो इसका एक अधिकतम कार्य है जो आपके मामले में बहुत उपयोगी होगा।

इसलिए आप इस तरह का उपयोग कर सकते हैं:

_.maxBy(jsonSlice, 'y');

6

या एक साधारण प्रकार! वास्तविक रखते हुए :)

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) है। यह ओ (नाल) है। जब तक दक्षता का त्याग नहीं किया जाता है तब तक सरल कोड लिखना अच्छा होता है।
वाइल्डहैमर

@Wildhammer - वास्तव में माइक्रो-अनुकूलन इसके लायक है जब आपके पास सबूत हैं कि आप एक अड़चन का अनुकूलन कर रहे हैं। । ज्यादातर मामलों में, उच्च-कुशल कोड की तुलना में सरल कोड बेहतर विकल्प है।
१६:४ł पर कामिल कील्सेवस्की

@ KamilKiełczewski उस लेख में दोनों सरणी तुलना में एक ही समय जटिलता है जो अंतर उनके गुणांक में है। उदाहरण के लिए, एक समाधान खोजने के लिए n समय इकाइयाँ लेता है, जबकि दूसरा 7n है। समय जटिलता सिद्धांत में, ये दोनों O (n) हैं। हम अधिकतम खोजने की समस्या के बारे में जो बात कर रहे हैं वह O (n) के साथ O (n) की तुलना है। अब यदि आप गारंटी दे सकते हैं कि n 10 से अधिक नहीं है तो आप अपने समाधान का उपयोग कर सकते हैं अन्यथा O (n) एल्गोरिथ्म हमेशा विजेता और प्रदर्शन (उपयोगकर्ता अनुभव) हमेशा डेवलपर अनुभव से पहले होता है (उद्योग के लोगों से पूछें, वे आपको बताते हैं कि!) ।
वाइल्डहैमर

@Wildhammer nope - भले ही आपके एरे में n = 10000 एलिमेंट्स हों, उपयोगकर्ता को अंतर - प्रूफ HERE नहीं दिखेगा । प्रदर्शन का अनुकूलन केवल ऐप अड़चन के लिए अच्छा है (उदाहरण के लिए, आपको बड़े सरणियों को संसाधित करने की आवश्यकता है) - लेकिन ज्यादातर मामले में एक प्रदर्शन-फोकस गलत दृष्टिकोण और समय (= पैसा) बर्बाद कर रहा है। यह अच्छी तरह से ज्ञात कोड एप्रोच
मिस्टेक है





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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.