快速获取对象属性中最小/最大值的方法

我有这样的JavaScript的对象:

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

有没有一种快速的方法来获得属性中的最小值和最大值,而不必循环遍历它们呢? 因为我拥有的对象是巨大的,我需要每两秒钟获取最小/最大值。 (对象的值不断变化)。

没有办法find一般情况下的最大值/最小值,没有循环遍历所有的n个元素(如果你从1到n-1,你怎么知道元素n是不是大于(或小于)当前最大/最小)?

你提到这个值每隔几秒就会改变一次。 如果您确切知道哪些值会发生变化,您可以从之前的最大值/最小值开始,只能与新值进行比较,但即使在这种情况下,如果修改的值之一是您的旧最大值/最小值,也可以需要再次循环。

另一种方法 – 再次,只有在数值变化很小的情况下,才能将值存储在树或堆等结构中,并且在新值到达时,您可以适当地插入(或更新)它们。 但是,基于你的问题,你能否做到这一点还不清楚。

尝试这个:

 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/


更新:现代版(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}` ); 

minmax不得不循环input数组,否则他们将如何find最大或最小的元素?

所以只是一个快速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]; } 

对于不同深度的嵌套结构,即{node: {leaf: 4}, leaf: 1} ,这可以工作(使用lodash或下划线):

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

这适用于我:

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