快速获取对象属性中最小/最大值的方法
我有这样的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}` );
min
和max
不得不循环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); });