वस्तु के गुणों के बीच न्यूनतम / अधिकतम मान प्राप्त करने का तेज़ तरीका


93

मैं इस तरह जावास्क्रिप्ट में एक वस्तु है:

{ "a":4, "b":0.5 , "c":0.35, "d":5 }

क्या उन सभी के माध्यम से लूप लिए बिना गुणों के बीच न्यूनतम और अधिकतम मूल्य प्राप्त करने का एक तेज़ तरीका है? क्योंकि मेरे पास जो वस्तु है वह बहुत बड़ी है और मुझे हर दो सेकंड में न्यूनतम / अधिकतम मूल्य प्राप्त करने की आवश्यकता है। (वस्तु के मूल्य बदलते रहते हैं)।


3
@Oleg: ठीक है, केवल यह दिया, यह बहुत अच्छी तरह से JSON हो सकता है। Youssef: JSON को एक ऑब्जेक्ट में पार्स और उसके गुणों पर पुनरावृति।
फेलिक्स क्लिंग

@ ओलेगवी.वोलोव मैं JSON.parse () का उपयोग कर रहा हूं जो इसे जोंस नहीं बनाना चाहिए?
यूसुफ

@ यससेफ़ यह पार्सिंग से पहले JSON (जो एक स्ट्रिंग मूल्य है) था। यह पार्स करने के बाद एक ऑब्जेक्ट वैल्यू है।
50 समय विद्या

2
JSON वस्तुओं की स्ट्रिंग संकेतन है। जब आप JSON को किसी ऑब्जेक्ट पर पार्स करते हैं, तो यह JSON फॉर्मेट में नहीं है
altschuler

1
मैंने आपके प्रश्न में JSON -> ऑब्जेक्ट को ठीक करने की स्वतंत्रता ली, क्योंकि टिप्पणियां पुष्टि करती हैं कि यह वही है जो आपके लिए है।
ओलेग वी। वोल्कोव

जवाबों:


19

सभी एन एलिमेंट्स के माध्यम से सामान्य मामले में अधिकतम / न्यूनतम पता लगाने का कोई तरीका नहीं है (यदि आप 1 से एन -1 तक जाते हैं, तो आपको कैसे पता चलेगा कि एलिमेंट एन बड़ा नहीं है (या छोटा) वर्तमान अधिकतम / मिनट)?

आपने उल्लेख किया है कि मान प्रत्येक सेकंड में बदलते हैं। यदि आप जानते हैं कि कौन से मूल्य बदलते हैं, तो आप अपने पिछले अधिकतम / मिनट मूल्यों के साथ शुरू कर सकते हैं, और केवल नए लोगों के साथ तुलना कर सकते हैं, लेकिन इस मामले में भी, यदि संशोधित किए गए मूल्यों में से एक आपका पुराना अधिकतम / मिनट था, तो आप हो सकते हैं फिर से उनके माध्यम से पाश की जरूरत है।

एक अन्य विकल्प - फिर से, केवल तभी जब मूल्यों की संख्या छोटी होती है - एक पेड़ या ढेर जैसी संरचना में मूल्यों को संग्रहीत करना होगा, और जैसे ही नए मूल्य आते हैं, आप उन्हें उचित रूप से सम्मिलित (या अपडेट) करेंगे। लेकिन क्या आप ऐसा कर सकते हैं जो आपके प्रश्न के आधार पर स्पष्ट नहीं है।

यदि आप सभी तत्वों से गुजरते हुए दी गई सूची का अधिकतम / न्यूनतम तत्व प्राप्त करना चाहते हैं, तो आप नीचे दिए गए स्निपेट की तरह कुछ का उपयोग कर सकते हैं, लेकिन आप उन सभी के माध्यम से जाने बिना ऐसा नहीं कर पाएंगे

var list = { "a":4, "b":0.5 , "c":0.35, "d":5 };
var keys = Object.keys(list);
var min = list[keys[0]]; // ignoring case of empty list for conciseness
var max = list[keys[0]];
var i;

for (i = 1; i < keys.length; i++) {
    var value = list[keys[i]];
    if (value < min) min = value;
    if (value > max) max = value;
}

2
यह वर्णन नहीं करता है कि किसी वस्तु के गुणों का न्यूनतम / अधिकतम मान कैसे प्राप्त किया जाए।
FistOfFury

आप किसी ऑब्जेक्ट पर ध्यान केंद्रित कर रहे हैं, सूची नहीं। minऔर maxअपरिभाषित हैं। क्या आपको for inइसके बजाय लूप का उपयोग करने का मतलब था ?
टोनिक्स

1
धन्यवाद @tonix, इसे ठीक किया।
कार्लोफैक्टरीरा

138

अपडेट: आधुनिक संस्करण (ES6 +)

let obj = { a: 4, b: 0.5 , c: 0.35, d: 5 };

let arr = Object.values(obj);
let min = Math.min(...arr);
let max = Math.max(...arr);

console.log( `Min value: ${min}, max value: ${max}` );


मूल उत्तर:

इसे इस्तेमाल करे:

let obj = { a: 4, b: 0.5 , c: 0.35, d: 5 };
var arr = Object.keys( obj ).map(function ( key ) { return obj[key]; });

और फिर:

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

लाइव डेमो: http://jsfiddle.net/7GCu7/1/


21
भी कर सकते हैंmax = Object.keys(obj).reduce(function(m, k){ return obj[k] > m ? obj[k] : m }, -Infinity);
लेवी

4
अब यह भी कर सकते हैं: Math.max(...arr);
cmac

1
@cmac मैंने ES6 संस्करण जोड़ा है।
36इमे विद

@ OtsimeVidas - Math.min और अधिकतम फ़ंक्शन पर 3 डॉट्स क्या दर्शाते हैं? धन्यवाद
AME


12

min तथा max इनपुट सरणी के माध्यम से वैसे भी लूप करना है - वे सबसे बड़ा या सबसे छोटा तत्व कैसे ढूंढेंगे?

तो बस एक त्वरित for..inलूप ठीक काम करेगा।

var min = Infinity, max = -Infinity, x;
for( x in input) {
    if( input[x] < min) min = input[x];
    if( input[x] > max) max = input[x];
}

1
यह IE7 / 8 के लिए बहुत अच्छा है। चीयर्स @ नीट द डार्क
एबसोल

यह जरूरी नहीं कि उनके मूल्यों को प्राप्त करने के लिए सरणी के माध्यम से न्यूनतम और अधिकतम लूप हो। यह अधिक संभव है कि वे सरणी को
तेज

7
@goonerify सबसे तेज़ सॉर्ट है O(n log n), जो स्वाभाविक रूप से धीमा है O(n)कि सिर्फ एक बार स्कैन करने से होगा ...
नीट द डार्क एबोल

11

तुम कोशिश कर सकते हो:

const obj = { a: 4, b: 0.5 , c: 0.35, d: 5 };
const max = Math.max.apply(null, Object.values(obj));
console.log(max) // 5

5
// 1. iterate through object values and get them
// 2. sort that array of values ascending or descending and take first, 
//    which is min or max accordingly
let obj = { 'a': 4, 'b': 0.5, 'c': 0.35, 'd': 5 }
let min = Object.values(obj).sort((prev, next) => prev - next)[0] // 0.35
let max = Object.values(obj).sort((prev, next) => next - prev)[0] // 5

1
स्पष्टीकरण जोड़ा गया।
एंड्री कुद्रियावत्सेव



3

यहां एक समाधान है जो आपको कुंजी को वापस करने की अनुमति देता है और केवल एक लूप करता है। यह ऑब्जेक्ट की प्रविष्टियों (वैल द्वारा) को सॉर्ट करता है और फिर पहले और आखिरी को वापस करता है।

इसके अतिरिक्त, यह उस सॉर्ट किए गए ऑब्जेक्ट को लौटाता है जो मौजूदा ऑब्जेक्ट को बदल सकता है ताकि भविष्य के प्रकार तेजी से हो जाएं क्योंकि यह पहले से ही अर्ध-सॉर्ट किया जाएगा = ओ (एन) से बेहतर होगा। यह ध्यान रखना महत्वपूर्ण है कि ऑब्जेक्ट ईएस 6 में अपने आदेश को बनाए रखते हैं।

const maxMinVal = (obj) => {
  const sortedEntriesByVal = Object.entries(obj).sort(([, v1], [, v2]) => v1 - v2);

  return {
    min: sortedEntriesByVal[0],
    max: sortedEntriesByVal[sortedEntriesByVal.length - 1],
    sortedObjByVal: sortedEntriesByVal.reduce((r, [k, v]) => ({ ...r, [k]: v }), {}),
  };
};

const obj = {
  a: 4, b: 0.5, c: 0.35, d: 5
};

console.log(maxMinVal(obj));


धन्यवाद! मैं यह पता लगाने की कोशिश कर रहा था कि मूल्य के साथ जाने के लिए कुंजी को बनाए रखते हुए अधिकतम कैसे प्राप्त किया जाए। इससे मदद मिली! :)
010011100101

2

अलग-अलग गहराई की नेस्टेड संरचनाओं के लिए {node: {leaf: 4}, leaf: 1}, यह काम करेगा (लॉश या अंडरस्कोर का उपयोग करके):

function getMaxValue(d){
    if(typeof d === "number") {
        return d;
    } else if(typeof d === "object") {
        return _.max(_.map(_.keys(d), function(key) {
            return getMaxValue(d[key]);
        }));
    } else {
        return false;
    }
}

2
var newObj = { a: 4, b: 0.5 , c: 0.35, d: 5 };
var maxValue = Math.max(...Object.values(newObj))
var minValue = Math.min(...Object.values(newObj))

3
जब किसी पुराने प्रश्न का उत्तर दिया जाता है, तो आपका उत्तर अन्य StackOverflow उपयोगकर्ताओं के लिए अधिक उपयोगी होगा यदि आपने यह समझाने के लिए कुछ संदर्भ शामिल किए कि आपका उत्तर कैसे मदद करता है, विशेष रूप से एक प्रश्न के लिए जो पहले से ही स्वीकृत उत्तर है। देखें: कैसे मैं एक अच्छा जवाब लिख सकता हूं
डेविड बक

0

यह मेरे लिए काम करता है:

var object = { a: 4, b: 0.5 , c: 0.35, d: 5 };
// Take all value from the object into list
var valueList = $.map(object,function(v){
     return v;
});
var max = valueList.reduce(function(a, b) { return Math.max(a, b); });
var min = valueList.reduce(function(a, b) { return Math.min(a, b); });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.