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

You*_*sef 79 javascript jquery

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

{ "a":4, "b":0.5 , "c":0.35, "d":5 }
Run Code Online (Sandbox Code Playgroud)

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

Šim*_*das 118

试试这个:

var arr = Object.keys( obj ).map(function ( key ) { return obj[key]; });
Run Code Online (Sandbox Code Playgroud)

然后:

var min = Math.min.apply( null, arr );
var max = Math.max.apply( null, arr );
Run Code Online (Sandbox Code Playgroud)

现场演示: 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}` );
Run Code Online (Sandbox Code Playgroud)

  • 也可以做`max = Object.keys(obj).reduce(function(m,k){return obj [k]> m?obj [k]:m}, - Infinity);` (18认同)
  • 现在也可以这样做:`Math.max(... arr);` (4认同)
  • @AME阅读:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator (2认同)

car*_*ira 18

在没有循环遍历所有n个元素的情况下,无法找到一般情况下的最大值/最小值(如果从1到n-1,则如何知道元素n是否不大于(或小于)当前最大/分钟)?

您提到值每隔几秒就会改变一次.如果您确切地知道哪些值发生了变化,您可以从先前的最大/最小值开始,并且只与新的值进行比较,但即使在这种情况下,如果其中一个值被修改为您的旧最大值/分钟,您可以需要再次循环它们.

另一种选择 - 再次,只有当更改的值的数量很小时 - 才会将值存储在诸如树或堆之类的结构中,并且当新值到达时,您将适当地插入(或更新)它们.但是,基于你的问题,你能否做到这一点并不明确.

  • +1用于使用不同的数据结构 (8认同)
  • 这没有描述如何获取对象属性的最小/最大值。 (2认同)

Nie*_*sol 10

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];
}
Run Code Online (Sandbox Code Playgroud)

  • @goonerify最快的排序是"O(n log n)",它本身比"O(n)"慢,只扫描一次就会...... (6认同)

Dav*_*alu 8

您可以尝试:

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
Run Code Online (Sandbox Code Playgroud)


And*_*sev 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
Run Code Online (Sandbox Code Playgroud)