Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to get maximum of value between multiple keys from array

how to get maximum of value between multiple keys from array?

I have tried this below method for only three(not multiple) keys.

getMaxValuefromkeys(values: any[], key1: string, key2: string, key3: string) {
    var val1 = Math.max.apply(Math, values.map(function (a) { return a[key1] }));
    var val2 = Math.max.apply(Math, values.map(function (a) { return a[key2]; }));
    var val3 = Math.max.apply(Math, values.map(function (a) { return a[key2]; }));
    if (val1 >= val2 || val1 >= val3) {
        return val1;
    } else if (val2 >= val3 || val2 >= val1) {
        return val2;
    }
    return val3;
}

But we need to check more condition and write more codes if we use multiple keys. So I have tried these below codes

Math.max.apply(Math, values.map(function (a) { return a[key1], a[key2], a[key3]; }));
                                         // where I want to return multiple keys 

But it's not working. Is any single line of code available for getting max value in between multiple keys from array?

like image 818
Ramesh Rajendran Avatar asked Jun 23 '17 10:06

Ramesh Rajendran


2 Answers

Array#map each object to it's maximum value, then find the maximum of the array:

var values = [{ a: 4, b: 3 }, { a: 2, b: 8 }, { a: 1, b: 2 }];

var key1 = 'a', key2 = 'b';

var result = Math.max.apply(Math, values.map(function (a) { return Math.max(a[key1], a[key2]); }));

console.log(result);

If you want something more flexible that can accept multiple keys:

var values = [{ a: 4, b: 3, c: 23 }, { a: 2, b: 28, c: 13 }, { a: 1, b: 2, c: 1 }];

function getMaxOfKeys(values, keys) {
  return Math.max.apply(Math, values.map(function(obj) {
    return Math.max.apply(Math, keys.map(function(key) {
      return obj[key];
    }));
  }));
}

// or the ES6 equivalent

const getMaxOfKeysES6 = (values, keys) => 
  Math.max(...values.map(
    (obj) => 
      Math.max(...keys.map((key) => obj[key]))
    )
  );

console.log(getMaxOfKeys(values, ['a', 'b', 'c']));
console.log(getMaxOfKeysES6(values, ['a', 'b', 'c']));
like image 187
Ori Drori Avatar answered Sep 27 '22 23:09

Ori Drori


(plain ES6 - I don't do TypeScript)

Given your object values and a set of keys that you wish to compare, e.g.:

let values = [
   { key1: 2, key2: 3, key3: 0 },
   { key1: 10, key2: 0, key3: 5 }
];

then for each key, find the maximal value within each object and return that as an array, and then find the maximal value of that array.

function getMaxValuefromkeys(values, ...keys) {
    return Math.max(...keys.map(key => Math.max(...values.map(o => o[key]))));
}

with usage:

let max = getMaxValuefromkeys(values, 'key1', 'key2', 'key3');

or given an array of keys:

let max = getMaxValuefromkeys(values, ...keys);
like image 40
Alnitak Avatar answered Sep 27 '22 22:09

Alnitak