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

时间:2012-06-21 16:45:44

标签: javascript jquery

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

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

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

12 个答案:

答案 0 :(得分:99)

试试这个:

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

答案 1 :(得分:17)

在没有循环遍历所有 n 元素的情况下,无法找到一般情况下的最大值/最小值(如果你从1变为n-1,你怎么知道元素是否< strong> n 不比当前最大/最小值大(或小)?

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

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

答案 2 :(得分:8)

无论如何,

minmax必须遍历输入数组 - 他们如何才能找到最大或最小的元素?

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

答案 3 :(得分: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

答案 4 :(得分:3)

使用lodash library你可以写更短的

substr

答案 5 :(得分:3)

您可以尝试:

{
  "id": "END_1888,60,-32",
  "name": "END",
  "icon": "waypoint-normal.png",
  "x": some value x,
  "y": some value y,
  "z": some value z,
}

答案 6 :(得分:2)

对于不同深度的嵌套结构,即{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;
    }
}

答案 7 :(得分:2)

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

答案 8 :(得分:1)

这是一个允许您也返回键并且仅执行一次循环的解决方案。它将对象的条目排序(按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));

答案 9 :(得分:1)

您也可以尝试使用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);

答案 10 :(得分:0)

这对我有用:

_library

答案 11 :(得分:0)

// Sorted
let Sorted = Object.entries({ "a":4, "b":0.5 , "c":0.35, "d":5 }).sort((prev, next) => prev[1] - next[1])
>> [ [ 'c', 0.35 ], [ 'b', 0.5 ], [ 'a', 4 ], [ 'd', 5 ] ]


//Min:
Sorted.shift()
>> [ 'c', 0.35 ]

// Max:
Sorted.pop()
>> [ 'd', 5 ]