我在javascript中有这样的对象:
{ "a":4, "b":0.5 , "c":0.35, "d":5 }
是否有一种快速的方法来获取属性之间的最小值和最大值而不必遍历所有属性?因为我拥有的物体很大,所以我需要每两秒钟获取最小值/最大值。(对象的值不断变化)。
我在javascript中有这样的对象:
{ "a":4, "b":0.5 , "c":0.35, "d":5 }
是否有一种快速的方法来获取属性之间的最小值和最大值而不必遍历所有属性?因为我拥有的物体很大,所以我需要每两秒钟获取最小值/最大值。(对象的值不断变化)。
Answers:
在没有遍历所有n个元素的情况下,通常无法找到最大值/最小值(如果从1转到n-1,如何知道元素n是否大于(或小于)n个元素?当前的最大/最小)?
您提到值每两秒钟更改一次。如果您确切知道哪个值发生了变化,则可以从以前的最大/最小值开始,仅与新的/最大值进行比较,但是即使在这种情况下,如果修改的值之一是您的旧的最大/最小值,则可以需要再次遍历它们。
同样,另一种选择是-仅当更改的值的数量很小时-将值存储在树或堆之类的结构中,并在新值到达时适当地插入(或更新)它们。但是根据您的问题,您是否可以做到这一点尚不清楚。
如果要在遍历所有元素的同时获取给定列表的最大/最小元素,则可以使用下面的代码段,但是如果不遍历所有元素,将无法执行此操作
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;
}
min并且max未定义。您是要使用for in循环吗?
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/
max = Object.keys(obj).reduce(function(m, k){ return obj[k] > m ? obj[k] : m }, -Infinity);
Math.max(...arr);
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];
}
O(n log n),其本质上比O(n)仅扫描一次的速度慢...
// 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
您也可以尝试 Object.values
const points = { Neel: 100, Veer: 89, Shubham: 78, Vikash: 67 };
const vals = Object.values(points);
const max = Math.max(...vals);
const min = Math.min(...vals);
console.log(max);
console.log(min);
使用lodash库,您可以编写得更短
_({ "a":4, "b":0.5 , "c":0.35, "d":5 }).values().max();
这是一个允许您也返回键并且仅执行一次循环的解决方案。它对对象的条目进行排序(按val),然后返回第一个和最后一个。
另外,它返回可以替换现有对象的已排序对象,因此将来的排序将更快,因为它已经被半排序=优于O(n)。重要的是要注意对象在ES6中保持其顺序。
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));
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))
这对我有用:
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); });