Fast way to get the min/max values among properties of object

后端 未结 11 1885
伪装坚强ぢ
伪装坚强ぢ 2020-12-01 00:44

I have an object in javascript like this:

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

Is there a fast way to get the minimum and maximum v

相关标签:
11条回答
  • 2020-12-01 00:55

    min and max have to loop through the input array anyway - how else would they find the biggest or smallest element?

    So just a quick for..in loop will work just fine.

    var min = Infinity, max = -Infinity, x;
    for( x in input) {
        if( input[x] < min) min = input[x];
        if( input[x] > max) max = input[x];
    }
    
    0 讨论(0)
  • 2020-12-01 00:56

    For nested structures of different depth, i.e. {node: {leaf: 4}, leaf: 1}, this will work (using lodash or underscore):

    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;
        }
    }
    
    0 讨论(0)
  • 2020-12-01 00:58

    This works for me:

    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); });
    
    0 讨论(0)
  • 2020-12-01 01:01

    Here's a solution that allows you to return the key as well and only does one loop. It sorts the Object's entries (by val) and then returns the first and last one.

    Additionally, it returns the sorted Object which can replace the existing Object so that future sorts will be faster because it will already be semi-sorted = better than O(n). It's important to note that Objects retain their order in 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));

    0 讨论(0)
  • 2020-12-01 01:08
    // 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
    
    0 讨论(0)
  • 2020-12-01 01:08
    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))
    
    0 讨论(0)
提交回复
热议问题