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

IT技术 javascript jquery
2021-03-14 19:32:08

我在 javascript 中有一个像这样的对象:

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

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

6个回答

更新:现代版本(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/

2021-04-22 19:32:08
现在也可以这样做: Math.max(...arr);
2021-04-27 19:32:08
@cmac 我添加了一个 ES6 版本。
2021-04-27 19:32:08
@ŠimeVidas - Math.min & max 函数上的 3 个点代表什么?谢谢
2021-04-27 19:32:08
还可以做 max = Object.keys(obj).reduce(function(m, k){ return obj[k] > m ? obj[k] : m }, -Infinity);
2021-05-11 19:32:08

在不循环遍历所有n 个元素的情况下,没有办法在一般情况下找到最大值/最小值(如果你从 1 到 n-1,你怎么知道元素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循环代替吗?
2021-05-06 19:32:08
这不描述如何获取对象属性的最小值/最大值。
2021-05-14 19:32:08

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];
}
这对 IE7/8 非常有用。干杯@Niet the Dark Absol
2021-05-03 19:32:08
min 和 max 循环遍历数组以获取它们的值不一定是正确的。他们对数组进行快速排序并根据该结果选择最小值和最大值更为可行
2021-05-08 19:32:08
@goonerify 最快的排序是O(n log n),它本质上比O(n)只扫描一次的速度慢......
2021-05-18 19:32:08

你可以试试:

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
// 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
补充说明。
2021-05-14 19:32:08